视频去抖动稳像总结

2023-10-29

 

下面转载了两篇别的文章,都是传统算法做的,后面将会持续更新

 


原文链接:https://blog.csdn.net/update7/article/details/107864986

1. 背景
点播、直播行业的蓬勃发展,使用户生产视频(UGC)逐渐替代了专家生产和平台生产的方式,成为了主流。由于广大用户不可能全都具备专业素质和专业器材,其产出的视频往往质量较差,最明显的特征就是存在抖动。

减少视频抖动有很多方法,包括

使用专业摄影辅助器材,如三脚架
使用带有物理防抖功能的镜头,如iphone
使用带有实时防抖功能的软件
使用Premiere,AfterEffects等视频软件进行后期防抖
以上几种方式,实践中都经常被采用。然而这些方法都各自存在缺陷。辅助器材笨重、不便携,成本较高;物理防抖设备成本较高;软件防抖对硬件性能要求较高,且会使镜头移动时有一种“笨重”感,体验不佳;软件后期防抖则只有专业人士才能进行。

针对上述问题,一个较好的解决方案是使用算法自动完成视频后期抖动处理。笔者从零开始初步实现了一套类似的系统。下文将逐步介绍此系统的工作流程。

2. 算法流程
2.1 运动分析
视频抖动的本质是图像存在着微小、方向随机、频率较高的运动。首先要检测到图像帧与帧之间的运动方向。

2.2 角点检测
图像中的任何一个物体都通常含有独特的特征,但往往由大量的像素点构成。角点是能够准确描述这个物体的一个数量较少的点集。角点检测算法可以分析出图像最明显的特征点,用于物件识别和跟踪。

2.3 光流
由于目标对象或者摄像机的移动造成的图像对象在连续两帧图像中的移动被称为光流。它是一个2D向量场,可以用来显示一个点从第一帧图像到第二帧图像之间的移动。

2.4 RANSAC
RANSAC是“RANdomSAmple Consensus(随机抽样一致)”的缩写。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。

两帧连续图像有各自的角点集合,RANSAC可以从含有噪声的数据中发现相互匹配的点集,进而计算出两帧图像的变换矩阵。

2.5 运动平滑
2.5.1 维度选择
利用图像匹配算法,我们可以获得两幅图像之间的变换矩阵,矩阵包含了大量的信息。但在视频防抖需求中,我们需要关心的只有3个信息:水平位移、竖直位移和旋转角度。从矩阵中抽出相应的值,可以得到如下运动轨迹曲线。曲线中大量的“毛刺”就是我们要消除的抖动。

水平方向运动轨迹

竖直方向运动轨迹

旋转角度

2.5.2 运动轨迹平滑
这里一般使用滤波、拟合或最优化等方法来对曲线进行平滑,下面是两种不同的算法得到的结果。

1. Kalman滤波

Kalman滤波在控制类场景中运用较多,使用前面的运动来预测下一个运动,消除采样噪声。

由于Kalman只依赖前面的数据,所以更适合软件实时防抖。在后期防抖中,得出的结果往往会有一些“惯性”,效果并非最佳。

 

 

2. 中值滤波

一种最简单但有效的滤波方式。在防抖场景中的缺点是对结果缺乏掌控。

 

2.5.3 修复运动计算
平滑轨迹与原始轨迹做差即可获得修复运动参数。

2.6 图像变换
仿射变换(Affine Transformation或 Affine Map)是一种二维坐标到二维坐标之间的线性变换,它可以保持图像的平直性和平行性。变换方式与矩阵参数的一些基本形式如下图。

2.7 去抖效果
https://v.qq.com/txp/iframe/player.html?vid=i0905uaprzt

2.8 OpenCV代码
OpneCV3.x中提供了专门应用于视频稳像技术的模块,该模块包含一系列用于全局运动图像估计的函数和类。结构体videostab::RansacParams实现了RANSAC算法,这个算法用来实现连续帧间的运动估计。videostab::MotionEstimatorBase是基类中所有全局运动估计方法,videostab::MotionEstimatorRansacL2描述了一个健壮的RANSAC-based全局二维估计方法的最小化L2误差。

 
 

#include <opencv2/opencv.hpp>
 
#include <opencv2/videostab.hpp>
 
#include <string>
 
#include <iostream>
 
 
 
using namespace std;
 
using namespace cv;
 
using namespace cv::videostab;
 
 
 
string inputPath = "inputVideo.avi";
 
string outputPath = "outputVideo.avi";
 
 
 
// 视频稳定输出
 
void videoOutput(Ptr<IFrameSource> stabFrames, string outputPath)
 
{
 
 VideoWriter writer;
 
 cv::Mat stabFrame;
 
 int nframes = 0;
 
 // 设置输出帧率
 
 double outputFps = 25;
 
 // 遍历搜索视频帧
 
 while (!(stabFrame = stabFrames->nextFrame()).empty())
 
 {
 
  nframes++;
 
  // 输出视频稳定帧
 
  if (!outputPath.empty())
 
  {
 
   if (!writer.isOpened())
 
    writer.open(outputPath, VideoWriter::fourcc('X', 'V', 'I', 'D'),
 
    outputFps, stabFrame.size());
 
   writer << stabFrame;
 
  }
 
  imshow("stabFrame", stabFrame);
 
  // esc键退出
 
  char key = static_cast<char>(waitKey(100));
 
  if (key == 27)
 
  {
 
   cout << endl;
 
   break;
 
  }
 
 }
 
 std::cout << "nFrames: " << nframes << endl;
 
 std::cout << "finished " << endl;
 
}
 
 
 
void cacStabVideo(Ptr<IFrameSource> stabFrames, string srcVideoFile)
 
{
 
 try
 
 {
 
 
 
  Ptr<VideoFileSource> srcVideo = makePtr<VideoFileSource>(inputPath);
 
  cout << "frame count: " << srcVideo->count() << endl;
 
 
 
  // 运动估计
 
  double estPara = 0.1;
 
  Ptr<MotionEstimatorRansacL2> est =
 
   makePtr<MotionEstimatorRansacL2>(MM_AFFINE);
 
 
 
  // Ransac参数设置
 
  RansacParams ransac = est->ransacParams();
 
  ransac.size = 3;
 
  ransac.thresh = 5;
 
  ransac.eps = 0.5;
 
 
 
  // Ransac计算
 
  est->setRansacParams(ransac);
 
  est->setMinInlierRatio(estPara);
 
 
 
  // Fast特征检测
 
  Ptr<FastFeatureDetector> feature_detector =
 
   FastFeatureDetector::create();
 
 
 
  // 运动估计关键点匹配
 
  Ptr<KeypointBasedMotionEstimator> motionEstBuilder =
 
   makePtr<KeypointBasedMotionEstimator>(est);
 
 
 
  // 设置特征检测器
 
  motionEstBuilder->setDetector(feature_detector);
 
  Ptr<IOutlierRejector> outlierRejector = makePtr<NullOutlierRejector>();
 
  motionEstBuilder->setOutlierRejector(outlierRejector);
 
 
 
  // 3-Prepare the stabilizer
 
  StabilizerBase *stabilizer = 0;
 
  // first, prepare the one or two pass stabilizer
 
  bool isTwoPass = 1;
 
  int radius_pass = 15;
 
  if (isTwoPass)
 
  {
 
   // with a two pass stabilizer
 
   bool est_trim = true;
 
   TwoPassStabilizer *twoPassStabilizer = new TwoPassStabilizer();
 
   twoPassStabilizer->setEstimateTrimRatio(est_trim);
 
   twoPassStabilizer->setMotionStabilizer(
 
    makePtr<GaussianMotionFilter>(radius_pass));
 
   stabilizer = twoPassStabilizer;
 
  }
 
  else
 
  {
 
   // with an one pass stabilizer
 
   OnePassStabilizer *onePassStabilizer = new OnePassStabilizer();
 
   onePassStabilizer->setMotionFilter(
 
    makePtr<GaussianMotionFilter>(radius_pass));
 
   stabilizer = onePassStabilizer;
 
  }
 
 
 
  // second, set up the parameters
 
  int radius = 15;
 
  double trim_ratio = 0.1;
 
  bool incl_constr = false;
 
  stabilizer->setFrameSource(srcVideo);
 
  stabilizer->setMotionEstimator(motionEstBuilder);
 
  stabilizer->setRadius(radius);
 
  stabilizer->setTrimRatio(trim_ratio);
 
  stabilizer->setCorrectionForInclusion(incl_constr);
 
  stabilizer->setBorderMode(BORDER_REPLICATE);
 
  // cast stabilizer to simple frame source interface to read stabilized frames
 
  stabFrames.reset(dynamic_cast<IFrameSource*>(stabilizer));
 
  // 4-videoOutput the stabilized frames. The results are showed and saved.
 
  videoOutput(stabFrames, outputPath);
 
 }
 
 
 
 catch (const exception &e)
 
 {
 
  cout << "error: " << e.what() << endl;
 
  stabFrames.release();
 
 }
 
}
 
 
 
int main(int argc, char* argv[])
 
{
 
 Ptr<IFrameSource> stabFrames;
 
 // 输入输出视频准备
 
 
 
 cacStabVideo(stabFrames, inputPath);
 
 stabFrames.release();
 
 
 
 return 0;
 
}

 

opencv4.2视频稳像代码:
原文链接:https://blog.csdn.net/shixin_0125/article/details/105694961

// videostabDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
 
 
#include <iostream>
 
#include <opencv2/opencv.hpp>
#include <opencv2/videostab.hpp>
#include <string>
#include <iostream>
 
#pragma comment(lib, "opencv_core420.lib")
#pragma comment(lib, "opencv_videoio420.lib")
#pragma comment(lib, "opencv_highgui420.lib")
#pragma comment(lib, "opencv_features2d420.lib")
#pragma comment(lib, "opencv_videostab420.lib")
 
using namespace std;
using namespace cv;
using namespace cv::videostab;
 
string inputPath = "video_seq_2.avi";
string outputPath = "outputstab001.avi";//001 must
 
// 视频稳定输出
void videoOutput(Ptr<IFrameSource> stabFrames, string outputPath)
{
	VideoWriter writer;
	cv::Mat stabFrame;
	int nframes = 0;
	// 设置输出帧率
	double outputFps = 10;
	// 遍历搜索视频帧
	while (!(stabFrame = stabFrames->nextFrame()).empty())
	{
		nframes++;
		// 输出视频稳定帧
		if (!outputPath.empty())
		{
			if (!writer.isOpened())
				writer.open(outputPath, VideoWriter::fourcc('M', 'J', 'P', 'G'), outputFps, stabFrame.size());
 
			writer << stabFrame;
		}
		imshow("stabFrame", stabFrame);
		// esc键退出
		char key = static_cast<char>(waitKey(100));
		if (key == 27)
		{
			cout << endl;
			break;
		}
	}
	writer.release();
	std::cout << "nFrames: " << nframes << endl;
	std::cout << "finished " << endl;
}
 
void cacStabVideo(Ptr<IFrameSource> stabFrames, string srcVideoFile)
{
	try
	{
 
		Ptr<VideoFileSource> srcVideo = makePtr<VideoFileSource>(inputPath);
		cout << "frame count: " << srcVideo->count() << endl;
 
		// 运动估计
		double estPara = 0.1;
		Ptr<MotionEstimatorRansacL2> est =
			makePtr<MotionEstimatorRansacL2>(MM_AFFINE);
 
		// Ransac参数设置
		RansacParams ransac = est->ransacParams();
		ransac.size = 3;
		ransac.thresh = 5;
		ransac.eps = 0.5;
 
		// Ransac计算
		est->setRansacParams(ransac);
		est->setMinInlierRatio(estPara);
 
		// Fast特征检测
		Ptr<FastFeatureDetector> feature_detector =
			FastFeatureDetector::create();
 
		// 运动估计关键点匹配
		Ptr<KeypointBasedMotionEstimator> motionEstBuilder =
			makePtr<KeypointBasedMotionEstimator>(est);
 
		// 设置特征检测器
		motionEstBuilder->setDetector(feature_detector);
		Ptr<IOutlierRejector> outlierRejector = makePtr<NullOutlierRejector>();
		motionEstBuilder->setOutlierRejector(outlierRejector);
 
		// 3-Prepare the stabilizer
		StabilizerBase *stabilizer = 0;
		// first, prepare the one or two pass stabilizer
		bool isTwoPass = 1;
		int radius_pass = 15;
		if (isTwoPass)
		{
			// with a two pass stabilizer
			bool est_trim = true;
			TwoPassStabilizer *twoPassStabilizer = new TwoPassStabilizer();
			twoPassStabilizer->setEstimateTrimRatio(est_trim);
			twoPassStabilizer->setMotionStabilizer(
				makePtr<GaussianMotionFilter>(radius_pass));
			stabilizer = twoPassStabilizer;
		}
		else
		{
			// with an one pass stabilizer
			OnePassStabilizer *onePassStabilizer = new OnePassStabilizer();
			onePassStabilizer->setMotionFilter(
				makePtr<GaussianMotionFilter>(radius_pass));
			stabilizer = onePassStabilizer;
		}
 
		// second, set up the parameters
		int radius = 15;
		double trim_ratio = 0.1;
		bool incl_constr = false;
		stabilizer->setFrameSource(srcVideo);
		stabilizer->setMotionEstimator(motionEstBuilder);
		stabilizer->setRadius(radius);
		stabilizer->setTrimRatio(trim_ratio);
		stabilizer->setCorrectionForInclusion(incl_constr);
		stabilizer->setBorderMode(BORDER_REPLICATE);
		// cast stabilizer to simple frame source interface to read stabilized frames
		stabFrames.reset(dynamic_cast<IFrameSource*>(stabilizer));
		// 4-videoOutput the stabilized frames. The results are showed and saved.
		videoOutput(stabFrames, outputPath);
	}
 
	catch (const exception &e)
	{
		cout << "error: " << e.what() << endl;
		stabFrames.release();
	}
}
 
//对于实时视频流,使用缓存50帧来处理
int main(int argc, char* argv[])
{
	Ptr<IFrameSource> stabFrames;
	// 输入输出视频准备
 
	cacStabVideo(stabFrames, inputPath);
	stabFrames.release();
 
	getchar();
 
	return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视频去抖动稳像总结 的相关文章

  • 数字图像处理-python基于opencv代码实现 反转变换、对数变换和幂律(伽马)变换

    本文主要介绍对 数字图像处理 第三章书中示例图片实现 反转变换 对数变换以及伽马变换的代码 若要获取更多数字图像处理 python 深度学习 机器学习 计算机视觉等高清PDF以及 更多有意思的 分享 可搜一搜 微信公共号 分享猿 免费获取资
  • 去雾算法2020

    2022 去噪 去模糊 去雨去雾 1 Neural Compression Based Feature Learning for Video Restoration 用于视频复原的基于神经压缩的特征学习 视频处理 paper https a
  • 视频去抖动稳像总结

    下面转载了两篇别的文章 都是传统算法做的 后面将会持续更新 原文链接 https blog csdn net update7 article details 107864986 1 背景 点播 直播行业的蓬勃发展 使用户生产视频 UGC 逐
  • 图像增强 数据增强

    目录 python opncv 数据增强 亮度 opencv 亮度饱和度增强 vgg19图像增强 c opencv 图像增强 python opncv 数据增强 亮度 def data augment image brightness fa
  • 图像增强 cnn

    目录 实时图像增强 基于 间距自适应查找表 的方法 CVPR 2022 Image Adaptive 3DLUT 水下图像增强UWCNN wtf 直方图均衡化 CycleGan增强 2个项目 实时图像增强 基于 间距自适应查找表 的方法 C
  • Pytorch 图像增强 实现翻转裁剪色调等 附代码(全)

    目录 前言 1 裁剪 1 1 中心裁剪 1 2 随机裁剪 1 3 随机尺寸裁剪 2 翻转 2 1 水平翻转 2 2 垂直翻转 2 3 随机旋转 3 色调 3 1 灰度变换 3 2 色彩抖动 3 3 随机翻转颜色 3 4 随机调整锐度 3 5
  • 基于直方图均衡化的水下激光图像处理(MATLAB仿真)

    原文 http blog csdn net sunlinyi66 article details 39215447 基于直方图均衡化的水下图像增强 MATLAB仿真 可以对RGB三个通道进行直方图规定化从而实现水下图像增强 此处我们使用的是
  • OpenCV图像增强(二)——Retinex图像增强

    前言 1 Retinex图像增强是一种高动态范围图像的新色调映射技术 而基础理论是 物体的颜色是由物体对长波 红色 中波 绿色 短波 蓝色 光线的反射能力来决定的 而不是由反射光强度的绝对值来决定的 物体的色彩不受光照非均匀性的影响 具有一
  • Retinex理论及算法学习

    为了能够获取最大的信息量 达到更好的图像增强效果 了解人类视觉系统的特性和图像的属性是准确地选择图像增强方法的必备知识 一 人眼视觉系统 1 人眼成像 人的眼睛是一个非常复杂的器官 一般来说它就是一个球体 平均直径约为20mm 内壁是一层视
  • 图像处理(1) : 图像增强

    图像增强就是指通过某种图像处理方法对退化的某些图像特征 如边缘 轮廓 对比度等进行处理 以改善图像的视觉效果 提高图像的清晰度 或是突出图像中的某些 有用 压缩其他 无用 信息 将图像转换为更适合人或计算机分析处理的形式 图像增强可以分为两
  • 直方图均衡化原理

    原文 http www cnblogs com tianyalu p 5687782 html 直方图均衡化原理 直方图均衡化的作用是图像增强 有两个问题比较难懂 一是为什么要选用累积分布函数 二是为什么使用累积分布函数处理后像素值会均匀分
  • 深度学习图像增强---python库imgaug

    图像增强python库imgaug landmark 增强 segmentation 增强 imgaug用来做图像增强的一个python库 1 图像增强是在小样本以及提高模型泛化能力的通常采用的措施 下面总结一下我之前用到过的一些内容 la
  • 【数字图像处理】七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

    本文主要讲述基于VC 6 0 MFC图像处理的应用知识 主要结合自己大三所学课程 数字图像处理 及课件进行讲解 主要通过MFC单文档视图实现显示BMP图像增强处理 包括图像普通平滑 高斯平滑 不同算子的图像锐化知识 希望该篇文章对你有所帮助
  • 去除视障,重现清晰

    论文 https arxiv org abs 2004 01180 代码 https github com alex04072000 ObstructionRemoval 模型262m tensorflow 的 模型地址 https dri
  • 数字图像处理:使用直方图统计进行图像增强

    一 引言 在 数字图像处理 局部直方图处理 Local Histogram Processing https blog csdn net LaoYuanPython article details 120383974 介绍了基于像素的邻域进
  • 【红外DDE算法】HE算法在红外图像可视化上的应用(附源码)

    直方图均衡 HE 在红外图像可视化上的应用 附源码 1 背景需求 制冷型红外相机模拟前端使用较高数据位数进行采样 一般常用 14位 16 位 但是人眼对于灰度的感知 最多能感知 128 个灰阶 并且数据一般是以 8 的整数倍的位宽在电子系统
  • 【图像增强】Debiased Subjective Assessment of Real-World Image Enhancement

    最近学习了CVPR2021的一篇文章 真实世界图像增强的去偏主观质量评价 Debiased Subjective Assessment of Real World Image Enhancement 一 前言 图像质量评价 Image Qu
  • 【算法学习】【图像增强】【Retinex】White Patch Retinex

    转自 http blog 163 com yuyang tech blog static 21605008320130910480689
  • 水下图像采集

    原文 http blog csdn net sunlinyi66 article details 50153875 NASA提供的雾天标准图像 这次终于找到了雾天处理图像来自哪里了 雾天图像 http dragon larc nasa go
  • BMVC 2022 (东京大学)仅需90K参数!实时完成低光增强, 曝光矫正的超轻量级Transformer网络IAT,已开源

    本文由 52CV 粉丝投稿 作者 信息门下奶狗 知乎地址 https zhuanlan zhihu com p 535695807 我们提出Illumination Adaptive Transformer IAT 网络 用来探索实时的暗光

随机推荐

  • FastSAM 论文解读

    论文名称 Fast Segment Anything 论文地址 http export arxiv org pdf 2306 12156 代码地址 GitHub CASIA IVA Lab FastSAM Fast Segment Anyt
  • 案例 - 图书管理+聊天机器人

    文章目录 图书管理 8 1 渲染UI结构 8 2 案例用到的库和插件 8 3 渲染图书列表 核心代码 8 4 删除图书 核心代码 8 5 添加图书 核心代码 聊天机器人 9 1 演示案例要完成的效果 9 2 梳理案例的代码结构 9 3 将用
  • C# 关于运算符重载--矢量之间的运算

    运算符重载就是指重写 1 1 中的加号 那样我们可以实现1 1 1 类似的 其他运算符重载也是这样的道理 然运算符的重载用来干这些事显得鸡肋了些 更多的是 通过运算符重载去实现一般的加减乘除不能实现的运算 例如 gt 矢量的加减乘除 cla
  • 数据分析及算法总结

    一 K 近邻算 工作原理 简洁的讲 如果一个样本在特定的空间中的K个最邻近的中的大多数属于某个类 则这个样本属于这个类 用途 k近邻的目的是测量不同特征值与数据集之间的距离来进行分类 样本差异性 欧式距离 优缺点 优点 精度高 对异常值不敏
  • Vue-后台返回excel文件流,前端怎么处理

    导出Excel公用方法 export function exportMethod data axios method data method url data url data params data params responseType
  • 总结:多线程集合类java.util.concurrent.*

    目录 一 java util concurrent Java并发工具包 二 阻塞队列BlockingQueue 2 1 BlockingQueue用法 2 2 BlockingQueue的方法 2 3 BlockingQueue的实现 2
  • 利用dlib和opencv建立人脸识别数据集并进行人脸识别

    文章目录 一 dlib和opencv建立 二 人脸图像采集并储存 三 采集并保存特征值建立数据集 四 计算均值 五 总结 六 参考链接 一 dlib和opencv建立 请移步 基于dlib库实现人脸特征值提取 二 人脸图像采集并储存 采集2
  • element-ui实现动态菜单栏 并处理菜单栏折叠文本不隐藏问题

    element ui实现动态菜单栏 并处理菜单栏折叠文本不隐藏问题
  • html毛玻璃效果代码,纯CSS实现底层毛玻璃效果(代码示例)

    本篇文章给大家带来的内容是关于纯CSS实现底层毛玻璃效果 代码示例 有一定的参考价值 有需要的朋友可以参考一下 希望对你有所帮助 毛玻璃背景是一个很常见的网页样式 想要实现 其实并不难 但经过我在网上的搜索发现 大量实现方法都较为不规范 且
  • go版本升级

    Window版本的go升级 首先到Go语言中文网下载windows对应的go版本 此处将go升级到1 18 版本 直接下载安装 安装之前会提示卸载旧版本 确定后直接安装在原来的Go安装目录 直接覆盖 安装成功后 在终端输入go versio
  • oracle优化中的常用语句

    查看session使用数 或者称建立的连接数 select count from v session 1 2 查看oracle锁 SELECT substr v lock sid 1 4 SID substr username 1 12 U
  • 专利与论文-6:《专利权利要求书》的撰写与注意事项

    前言 专利权利要求书 在对于专利而言 怎么说它的重要性都不过分 它直接关系到你的专利的权利在哪里 当发生专利侵权的时候 如何保护自己的利益 如果说 专利权利说明书 是专利的技术性文档 那么 专利权利要求书 就是法律性文档 它定义了 哪些技术
  • prefetch 和 preload 及 webpack 的相关处理

    使用预取和预加载是网站性能和用户体验提升的一个很好的途径 本文介绍了使用 prefetch 和 prefetch 进行预取和预加载的方法 并使用 webpack 进行实现 Link 的链接类型 标签的 rel 属性可以定义链接类型 pref
  • 60黑马QT笔记之SQLite

    60黑马QT笔记之SQLite 1 与MYSQL的区别 1 SQLite是本地数据库 不需要和MYSQL一样需要连接 2 插入时不支持自动增长 所以主键例如id 在输入时需要自己去控制 3 使用时需要先提前建好后缀为xxx db的文本文件
  • ubuntu 20.04安装开发环境总结_安装python

    Ubuntu 20 04 是一款主要面向开发人员的操作系统之一 与此同时 它还支持多种开发环境和工具的使用 但是因为对市面上各种软件的支持没有window那样友好 所以对ubuntu系统安装配置各种环境的问题做了个总结 安装 PyCharm
  • C/C++入门秋招知识点八股文

    1 C C 关键字 1 1 static 静态 变量 在C中 关键字static是静态变量 静态变量只会初始化一次 然后在这函数被调用过程中值不变 在文件内定义静态变量 函数外 作用域是当前文件 该变量可以被文件内所有函数访问 不能被其他文
  • 38.求解简单表达式。输入一个形式如“操作数  运算符  操作数”的四则运算表达式,输出运算结果,要求使用switch语句编写

    38 求解简单表达式 输入一个形式如 操作数 运算符 操作数 的四则运算表达式 输出运算结果 要求使用switch语句编写 include
  • 高速缓存(cache)原理

    高速缓存 cache 概念和原理 cache基本思想 cache 存储器 Cache memories 在处理器附近增加一个小容量快速存储器 cache 基于SRAM 由硬件自动管理 cache基本思想 频繁访问的数据块存储在cache中
  • 前端和后端终极学习视频(百度网盘资料)

    1 ps 链接 https pan baidu com s 1mjYbcJA密码 pqdt2 HTML5 CSS3从入门到精通 iso链接 https pan baidu com s 1mjYbcJA密码 gdyw3 Javascript视
  • 视频去抖动稳像总结

    下面转载了两篇别的文章 都是传统算法做的 后面将会持续更新 原文链接 https blog csdn net update7 article details 107864986 1 背景 点播 直播行业的蓬勃发展 使用户生产视频 UGC 逐