您的位置:首页 > 运维架构

OpenCV 视频处理框架

2014-07-14 23:31 288 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: