我正在尝试读取视频文件,处理它,并将处理过的帧作为输出视频文件写入。但是,我收到以下错误:
OpenCV Error: Assertion failed (img.cols == width && img.rows == height && channels == 3) in write, file /.../opencv-cpp/modules/videoio/src/cap_mjpeg_encoder.cpp, line 829
terminate called after throwing an instance of 'cv::Exception'
what(): /.../opencv-cpp/modules/videoio/src/cap_mjpeg_encoder.cpp:829: error: (-215) img.cols == width && img.rows == height && channels == 3 in function write
我确信在.channels()
功能发生之前我有3个频道(我使用write()
进行了检查):
//generate video
cout<<finalOutputRGB.channels()<<endl;
outputCapRGB.write(finalOutputRGB);
所以问题不在这里。也许是我初始化的方式?
// Setup output videos
VideoWriter outputCapRGB(rgbVideoOutputPath, captureRGB.get(CV_CAP_PROP_FOURCC), captureRGB.get(CV_CAP_PROP_FPS),
Size(captureRGB.get(CV_CAP_PROP_FRAME_WIDTH), captureRGB.get(CV_CAP_PROP_FRAME_HEIGHT)));
它可能是什么?我想到的一件事是,在处理帧时,它们被裁剪,因此分辨率不一样。也许这可能就是原因。但话说回来,OpenCV不允许录制任何修改过的视频是愚蠢的。
所以我尝试用我的帧的裁剪尺寸创建视频标记对象,如下所示:
// Sizes of the videos to be written (after the processing)
Size irFrameSize = Size(449, 585);
Size rgbFrameSize = Size(488, 694);
// Setup output videos
VideoWriter outputCapRGB(rgbVideoOutputPath, captureRGB.get(CV_CAP_PROP_FOURCC), captureRGB.get(CV_CAP_PROP_FPS), rgbFrameSize);
VideoWriter outputCapIR(irVideoOutputPath, captureIR.get(CV_CAP_PROP_FOURCC), captureIR.get(CV_CAP_PROP_FPS), irFrameSize);
然而,我仍然得到同样的错误。
另外,我也很欣赏任何可以在Ubuntu上方便地裁剪视频文件的软件建议。这也可以解决问题。我会裁剪视频并将其输入。
有什么想法吗?
答案 0 :(得分:4)
例外情况表示您要编写的图像框的大小与视频标注中的大小不同。您应该检查您正在编写的每个图像帧是否具有与您的视频记录器相同的宽度/高度。
答案 1 :(得分:2)
只是在黑暗中拍摄:从错误,因为你确定你有3个通道,你有可能倒转宽度和高度?在OpenCV中,Size
定义为(width, height)
,而Mat
定义为(rows, cols)
,有效对应(height, width)
。
答案 2 :(得分:0)
可能我太迟了。但这个解决方案适合我。
使用Mat
调整cv::resize(finalOutputRGB,finalOutputRGB, cv::size(width, height*3))
的大小**使用图像的高度* 3作为高度。 **
就是这样。它解决了我的问题。希望这会有所帮助。