首页 文章

即使OpenCv对视频进行编码,OpenCv也无法打开非标准帧大小

提问于
浏览
0
cv::Mat im1;
cv::VideoCapture vidCapture;
vidCapture.set(CV_CAP_PROP_FRAME_WIDTH, 313);
vidCapture.set(CV_CAP_PROP_FRAME_HEIGHT, 621);
vidCapture.open("Image1.avi");  
vidCapture.grab();
vidCapture.retrieve(im1);
cv::imwrite("test.bmp", im1);

我使用OpenCv从摄像机捕获并记录了8位灰度视频 . 视频尺寸为313x621,因为相机前面有一些自定义镜头 . 不幸的是,这似乎打破了cv :: VideoCapture,即使OpenCv编码视频很好 . 我可以使用媒体播放器,VLC等打开并播放视频 .

当我使用OpenCV抓取一个帧时,我看到的只是一个彩色图像的通道 . 我也尝试过:

vidCapture.retrieve(im1, CV_LOAD_IMAGE_GRAYSCALE);

这产生与上面相同的图像,其中看起来OpenCv正在捕获彩色视频的一个通道 . 我使用以下方法存储图像:

CvVideoWriter* writer1 = cvCreateVideoWriter("Image1.avi",  -1, 60.0, cvGetSize(videoFrames->back()), 0);

它成功地创建了一个8位灰度视频 .

什么工作,如果我将视频帧填充到480x640 . 突然之间OpenCv成功解码了视频 . 虽然这是一个选项,但它非常令人沮丧,因为我必须批量转换我的所有视频,打开它们,然后重新裁剪到313x621进行后期处理 .

1 回答

  • 0

    您应该检查VideoCapture的后端是否支持CV_CAP_PROP_FRAME_WIDTH和CV_CAP_PROP_FRAME_HEIGHT的设置 . 它可以通过以下方式完成:

    double retCPFW = vidCapture.get(CV_CAP_PROP_FRAME_WIDTH);
    double retCPFH = vidCapture.get(CV_CAP_PROP_FRAME_HEIGHT);
    

    如果retCPFW或retCPFH等于0.0,则无法手动设置属性 .


    您还应尝试在不设置属性的情况下阅读视频:

    cv::Mat frame;
    cv::VideoCapture videoCapture("Image1.avi");
    videoCapture >> frame;
    

相关问题