如何在 OpenCV 2.4.3 中编写视频文件
Posted
技术标签:
【中文标题】如何在 OpenCV 2.4.3 中编写视频文件【英文标题】:How to write video file in OpenCV 2.4.3 【发布时间】:2012-11-29 10:12:50 【问题描述】:我正在使用 OpenCV 2.4.3 读取和写入视频文件。我的代码是这样的:
cv::VideoCapture video;
video.open ( "D:\\testVideo.avi" );
cv::VideoWriter output;
output.open ( "D:\\outputVideo.avi", CV_FOURCC('D','I','V','X'), 120, cv::Size ( 1200,1600), true );
cv::Mat img;
for ( int n = 0; ; n ++ )
video >> img;
output.write ( img );
然后结果视频是一个空文件,我无法打开它。我在这里做错了什么?
【问题讨论】:
我想说你错过了类似output.close()
的电话
不,我尝试了您建议的类似方法。它仍然没有工作。我怀疑这可能是一个错误。
虽然它是一个不常见的高分辨率。你试过减少它吗?
还没有,因为我真的很需要这个分辨率,而且在之前的2.4.2版本上效果很好。
这是一个重要信息。然后你应该提交一个错误报告。不能直接回到 2.4.2 吗?
【参考方案1】:
问题可能出在您使用的编解码器上。
确保您的东西正常工作的一个简单测试是从网络摄像头检索帧并将它们写入视频文件:
// Load input video
cv::VideoCapture input_cap(argv[1]);
if (!input_cap.isOpened())
std::cout << "!!! Input video could not be opened" << std::endl;
return;
// Setup output video
cv::VideoWriter output_cap(argv[2],
input_cap.get(CV_CAP_PROP_FOURCC),
input_cap.get(CV_CAP_PROP_FPS),
cv::Size(input_cap.get(CV_CAP_PROP_FRAME_WIDTH),
input_cap.get(CV_CAP_PROP_FRAME_HEIGHT)));
if (!output_cap.isOpened())
std::cout << "!!! Output video could not be opened" << std::endl;
return;
// Loop to read from input and write to output
cv::Mat frame;
while (true)
if (!input_cap.read(frame))
break;
output_cap.write(frame);
input_cap.release();
output_cap.release();
【讨论】:
不需要调用 .release 这里不需要释放内存吗? 这个类的析构函数已经调用了release()。所以当变量被销毁时,内存会自动释放。 我正在尝试使用默认网络摄像头,但它总是给出Output Video Could not be opened
的结果,扩展名也重要吗?【参考方案2】:
您声明 cv::VideoWriter output
的帧大小为 1200*1600。
所以将框架调整为 1200*1600 使用
cv::resize(img,img,cv::Size(1200,1600));
之前output.write(img);
【讨论】:
以上是关于如何在 OpenCV 2.4.3 中编写视频文件的主要内容,如果未能解决你的问题,请参考以下文章