我正在尝试读取视频文件,处理它,并将处理后的帧写入作为输出视频文件。但是,我收到以下错误:
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
我确定我有 3 个频道(我检查过.channels()
) 之前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 上方便地裁剪视频文件的软件的建议。这样也能解决问题。我会裁剪视频并将其输入。
有什么想法吗?