OpenCV 视频处理框架

news/2024/7/10 22:14:38 标签: 人工智能, ffmpeg

OpenCV 本身集成了 FFmpeg,因此对于视频是有解码和编码功能的。尽管其效率在本人看来还不能跟未被封装的FFmpeg相提并论,然用其来对视频进行解码得到图像,然后对图像进行处理并将得到的图像又一次压缩成视频是很方便的,以下将介绍把视频解码成图像并进行帧差法等操作后往回压缩成视频的框架搭建。值得注意的是在OpenCV2.1版本号图像压缩成视频是有BUG的,不妨用新的版本号来进行学习。除此之外。要让opencv支持压缩,还须要装相相应的编码器。详情可见。

#include <opencv2/opencv.hpp>  
#include "opencv2/highgui/highgui.hpp"   
#include <opencv2/core/core.hpp>
using namespace cv;

CvVideoWriter * pVW = NULL;//写回文件对象

void MotionDetect(IplImage *frame1, IplImage *frame2)//两帧图像处理函数
{
	//在此增加图像处理代码
}

void main()
{
	IplImage *frame1 = NULL, *frame2 = NULL;//frame1为新的图像,frame2为frame1的前一张图像
	CvCapture *capture = NULL;
	capture = cvCaptureFromAVI("2.avi");//打开视频
	frame1 = cvQueryFrame(capture);//从摄像头或者文件里抓取并返回一帧
	frame2 = cvCreateImage(cvGetSize(frame1), 8, 3);
	cvCopy(frame1, frame2);
	frame1 = cvQueryFrame(capture);
	pVW = cvCreateVideoWriter("output.avi", CV_FOURCC('D', 'I', 'V', 'X'), 30, cvSize(frame1->width, frame1->height), 1);//以mpeg4数据格式进行视频编码。帧率为30帧/s

	while (frame1)
	{
		MotionDetect(frame1, frame2);//移动侦測
		cvCopy(frame1, frame2);
		cvShowImage("", frame2);//显示处理完图像
		cvWaitKey(5);
		cvWriteFrame(pVW, frame2);//将处理完图像数据写入视频
		frame1 = cvQueryFrame(capture);//接着从视频中拷入图像
	}
	cvReleaseImage(&frame2);
	cvReleaseVideoWriter(&pVW);
}


由于这里调用到的解码器并不是OpenCV自带的,因此假设之前没安装对应的解码器,函数会一直返回空,这样的情况能够到这里下载对应的解码器来解决。



在OpenCV2.0接口中,实现代码例如以下:

#include <opencv2/opencv.hpp>    
#include "opencv2/highgui/highgui.hpp"     
#include <opencv2/core/core.hpp>  

using namespace cv;

void main()
{
	VideoCapture capture;
	capture.open("30.avi");
	if (!capture.isOpened())
	{
		printf("文件打开失败");
	}
	//获取整个帧数  
	long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);
	for (size_t i = 0; i < totalFrameNumber; i++)
	{
		Mat frame;
		capture >> frame;
		imshow("readvideo", frame);
		waitKey(10);
	}
}










转载于:https://www.cnblogs.com/brucemengbm/p/6718567.html


http://www.niftyadmin.cn/n/1700416.html

相关文章

第九章、epub文件处理 -- 显示.xhtml文件

2019独角兽企业重金招聘Python工程师标准>>> 第九章、epub文件处理 -- 显示.xhtml文件 经历了“千难万险”&#xff0c;我们终于进入了 XML 文件处理的最后部分 ---- 将 xhtml 文件的内容在屏幕上显示出来。本章将详细介绍显示的流程。 显示的流程是从ZLAndroidWid…

React之Context

文章目录概念APIcreateContext使用注意概念 Context可以让数据在组件树中自上而下自由传递&#xff0c;而不需要在树中层层的传递。层层传递不仅在编写代码的时候会十分繁琐&#xff0c;而且中间层级可能根本不关心所要传递的数据&#xff0c;所以也为后期的维护制造理解上的障…

React之lazy与suspense

文章目录动态importlazysuspenseError boundariesgetDerivedStateFromErrorcomponentDidCatch动态import 在说lazy和suspense之前&#xff0c;还是先说说动态import这种语法。 import语句我们使用的很多&#xff0c;通常是import ... from ...这样的写法&#xff0c;这样的写…

word2vec模型评估_阅读经典-word2vec

前言&#xff1a;说到稠密的word embedding ,最早的模型可追溯到2003年大佬Yoshua Bengio的NNLM&#xff08;A Neural probabilistic language model&#xff09;。然而受限于当时的计算机硬件&#xff0c;NNLM要在语料库上完成预训练需要消耗的时间和空间是一般研究者不能接受…

将代码托管到GitHub上

这篇文章参考郭霖的《第一行代码》 首先必须要注册个GitHub账号在GitHub个人主页&#xff0c;点击Start a project按钮来创建一个版本库将版本库命名&#xff0c;添加一个.gitignore文件和选择一个开源协议&#xff08;开源协议选择见下图&#xff09;&#xff0c;并勾选Initia…

React--useContext

在出现useContext之前&#xff0c;使用context的方式主要是两种&#xff0c;第一种需要使用Consumer&#xff1a; class Component2 extends Component{render(){return (<CountContext.Consumer>{count > <div>{count}</div>}</CountContext.Consume…

移动互联网时代的9大赚钱机会

近两年移动互联网火了&#xff0c;看大家都想在移动互联网行业捞桶金&#xff0c;在此&#xff0c;我就扒一扒那些我见过的赚钱方式&#xff0c;给大家指路&#xff0c;祝没有发财的朋友们早日发财。1.炒概念赚钱大家咋一看&#xff0c;炒概念也能赚钱?估计好多人有点看不懂&a…

React—useMemo与useCallback

看到“memo”这个字眼&#xff0c;很多人应该会想到memo方法。这是一个高阶函数&#xff0c;它会返回一个函数组件&#xff0c;作用相当于PureComponent。 而useMemo的作用也有点像&#xff0c;只不过它不是作用在函数组件上&#xff0c;而是在一段逻辑上&#xff0c;例如&…