【发布时间】:2019-03-10 22:45:11
【问题描述】:
我正在尝试使用 VideoWriter 类(当然还有 VideoCapture)来使用相机并保存视频,如果视频长于 10 秒,则最后 10 秒将保存在输出文件中。代码中有两个 VideoWriter 实例。但是,在运行时,我总是在控制台窗口中收到以下错误:OpenCV Error: Assertion failed (img.cols == width && img.rows == height*3) in
cv::mjpeg::MotionJpegWriter::write, file C:\build\master_winpack-build-win64-
vc14\opencv\modules\videoio\src\cap_mjpeg_encoder.cpp, line 842
这是我的代码:(C++)
void main()
{
VideoCapture vdc(0);
VideoWriter vw("REC.avi", CV_FOURCC('M', 'J', 'P', 'G'), 100.0, Size(vdc.get(CAP_PROP_FRAME_WIDTH), vdc.get(CAP_PROP_FRAME_HEIGHT)),true);
VideoWriter vw1("REC2.avi", CV_FOURCC('M', 'J', 'P', 'G'), 100.0, Size(vdc.get(CAP_PROP_FRAME_WIDTH), vdc.get(CAP_PROP_FRAME_HEIGHT)),true);
char cmd = 'a';
Mat frm;
DWORD st, ed;
st = GetTickCount();
while (cmd != 27 && vdc.isOpened())
{
vdc >> frm;
vw << frm;
vw1 << frm;
imshow("Camera", frm);
cmd = waitKey(10);
}
ed = GetTickCount();
destroyAllWindows();
cout << ed - st << endl;
vdc.release();
vw.release();
vw1.release();
if (ed - st > 10000)
{
VideoCapture vdc2("REC2.avi");
VideoWriter vw2("REC.avi", CV_FOURCC('M', 'J', 'P', 'G'), 100.0, Size(vdc2.get(CAP_PROP_FRAME_WIDTH), vdc2.get(CAP_PROP_FRAME_HEIGHT)),true);
DWORD st2, ed2;
st2 = getTickCount();
Mat frame;
while (vdc2.isOpened())
{
ed2 = getTickCount();
vdc2 >> frame;
if (ed2 - st2 > ed - st - 10000)
{
vw2 << frame;
waitKey(10);
if (vw2.get(CAP_PROP_POS_AVI_RATIO) == 1)break;
}
}
}
}
我确定频道数是三个,我用vw没有问题(实际上REC2.avi可以正常打开但REC.avi不能)。
我在Win10中使用VS2017和最新版本的OpenCV。
我是 OpenCV 的新手,没有什么可以尝试的。
【问题讨论】:
-
您在源代码的哪一行获得了 OpenCV 中的断言?
-
这一行:
vw2<<frame -
看看这个。 link.
-
但是这个和那个完全不同(而且似乎矛盾)。调整大小是没有用的,我已经检查了好几次,并且确定通道和大小是正确的——毕竟第一个 VideoWriter 是正确的。 @I.Newton