OpenCV视频AVI处理及合成

       有人用OpenCV做多媒体开发,OpenCV这方面比较弱,之所以把视频读取写入这部分做的强大一些,是为了方便大家做视频处理,由于这部分是基于vfw和ffmpeg二次开发的,功能还是很弱。切记一点,OpenCV是一个强大的计算机视觉库,而不是视频流编码器或者解码器。希望大家不要走入这个误区,可以把这部分简单单独看待。目前,OpenCV只支持avi的格式,而且生成的视频文件不能大于2GB,而且不能添加音频。如果你想突破这些限制,建议好好看看ffMpeg,而不是浪费时间在OpenCV上。不过也可以利用视频后期合成工具制作。

三种应用

  • 从摄像头读取视频流读取视频帧保存为图片
  • 从摄像头读取视频流读取视频帧保存为视频
  • 多个视频合成一个视频窗口播放
int readFromCamera()
{
	VideoCapture capture(0);//0表示打开默认的摄像头,自动探测
	if (!capture.isOpened())
	{
		cout << "open camera failed..\n" << endl;
		return -1;
	}
	//视频流属性
	//VideoCaptureProperties ------> CV_CAP_PROP_XXX
	//想要获取视屏对的属性信息,通过get()方法获取
	double fps = capture.get(CV_CAP_PROP_FPS);//帧信息
	cout << "每秒" << fps << "帧" << endl;

	int frameWidth = capture.get(CAP_PROP_FRAME_WIDTH);
	int frameHeight = capture.get(CAP_PROP_FRAME_HEIGHT);
	cout << frameWidth << "*" << frameHeight << endl;

	/* VideoWriter:
	 The constructors / functions initialize video writers.
	- On Linux FFMPEG is used to write videos;
	-On Windows FFMPEG or VFW is used;
	-On MacOSX QTKit is used.

	VideoWriter(const String& filename, int fourcc, double fps,
			Size frameSize, bool isColor = true);
	*/

	//写入的Size()尺寸要和前面读取到的帧尺寸大小相同,否则无法写入视频,大小一直为0KB或者6KB
	VideoWriter writer("av_1.avi", CV_FOURCC('D', 'I', 'V', 'X'), 25.0, Size(frameWidth, frameHeight), true);//构造函数方式
	//VideoWriter writer;
	//writer.open("av_2.avi", CV_FOURCC('D', 'I', 'V', 'X'), 30.0, Size(frameWidth, frameHeight0), true);//调用open函数方式

	Mat frame, bgmask;
	namedWindow("showVideo", CV_WINDOW_NORMAL);
	//Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();
	//pMOG2->apply(frame, bgmask, 0.5);
	int count = 0;
	char imagePath[20];
	while (capture.read(frame))
	{
		imshow("showVideo",frame);
		
		if (count<100)
		{
			sprintf(imagePath, "E://image//img_%03d.jpg", count);
			imwrite(imagePath,frame);//保存前100帧图像
			count++;
		}
		writer.write(frame);//写入视频文件
		char a = waitKey(10);//10毫秒内是否退出,27对应键盘的ESC键是否按下
		if (a == 27)
		{
			break;
		}
	}
	writer.release();//释放资源
	capture.release();//释放资源
	return 0;
}
http://www.fourcc.org/codecs.php 网页列出相应的编码格式
常用的有:
CV_FOURCC('P','I','M','1') = MPEG-1 codec
CV_FOURCC('M','J','P','G') = motion-jpeg codec
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') = H263 codec
CV_FOURCC('I', '2', '6', '3') = H263I codec
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

图片写视频流 

Mat src=imread("C:\\EXPERIMENT\\眼图照片  (glass)\\wph2\\l0.bmp",1);
char image_name[50];
int isColor = 1;
int fps = 10;
int frameWidth = src.cols;
int frameHeight = src.rows;

VideoWriter writer("C:\\EXPERIMENT\\test_l.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, Size(frameWidth, frameHeight), isColor);

cout << "info:" << endl
     << "ff.avi" << endl
     << "Size:" << frameWidth << "*" << frameHeight << endl
     << "fps:" << fps << endl;

for (int i = 0; i < 1000; i++)
{
    sprintf(image_name, "C:\\EXPERIMENT\\眼图照片(glass)\\wph2\\l%d.bmp", i);
    src = imread(image_name, 1);
    if (src.empty())
    {
       MessageBox(NULL, L"全部图像加载完成!", L"温馨提示", MB_OK | MB_ICONINFORMATION);
       break;
    }
    imshow("【src】", src);
    waitKey(5);
    writer.write(src);
}

 多个视频合成视频窗口播放

void mergeVideo()
{
	VideoCapture capture1;
	VideoCapture capture2;
	capture1.open("av_1_1.avi");
	capture2.open("av_1_2.avi");
	if (!capture1.isOpened() && !capture2.isOpened())
	{
		cout << "open video1 failed..\n" << endl;
		return;
	}
	Mat frame1, frame2;
	VideoWriter writer("av_3.avi", CV_FOURCC('D', 'I', 'V', 'X'), 30.0, Size(640,420), true);
	while (capture1.read(frame1) && capture2.read(frame2))
	{
		Mat result(Size(640, 420),CV_8UC3,Scalar::all(0));
		resize(frame1, frame1, Size(640, 210));
		resize(frame2, frame2, Size(640, 210));
		Mat roi1 = result(cv::Rect(0,0,640, 210));
		Mat roi2 = result(cv::Rect(0, 210,640,210));

		frame1.copyTo(roi1);
		frame2.copyTo(roi2);
		imshow("result", result);
		writer.write(result);
		char a = waitKey(10);//10毫秒内是否退出,27对应键盘的ESC键是否按下
		if (a == 27)
		{
			break;
		}

	}
	capture1.release();
	capture2.release();
	writer.release();
	waitKey(0);
	
}

参考

https://blog.csdn.net/qq_30241709/article/details/78850225(视频流处理)

发布了142 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_30460949/article/details/97390987