调整图像大小后OpenCV VideWriter无法工作

OpenCV VideWriter not working after image resize

本文关键字:VideWriter 工作 OpenCV 图像 调整      更新时间:2023-10-16

我使用的是OpenCV 3和Visual Studio。这里的问题是,除了默认的全相机分辨率外,我无法保存任何特定分辨率的视频。没有错误,但视频文件不会增长。它保持在5.54kb。

这是我的代码:

#include"opencv2opencv.hpp"
using namespace cv;
using namespace std;
VideoCapture cap_cam1(0);
double Width = cap_cam1.get(CV_CAP_PROP_FRAME_WIDTH);
double Height = cap_cam1.get(CV_CAP_PROP_FRAME_HEIGHT); 
cv::Size frameSize(static_cast<int>(Width), static_cast<int>(Height));
string videoFileName = "D://current.avi";
VideoWriter cam1_write(videoFileName, CV_FOURCC('D', 'I', 'V', '3'), 10.0, frameSize, true);
Mat image;
int main()
{
    while (true)
    {
        cap_cam1 >> image;
        resize(image, image, Size(320, 240));
        imshow("image", image);
        cam1_write.write(image);
        if (waitKey(33) == 27)break;
    }
}

如果我删除resize函数,那么文件大小会增加,并且会添加帧。我还尝试在VideoWriter定义之后添加以下行

cap_cam1.set(CV_CAP_PROP_FRAME_WIDTH, 240);
cap_cam1.set(CAP_PROP_FRAME_HEIGHT,320);

在所有文件大小保持在5.54kb之后,我还尝试在VideoWriter定义下更改分辨率

如何以自定义分辨率录制视频?

您正在使用

double Width = cap_cam1.get(CV_CAP_PROP_FRAME_WIDTH);
double Height = cap_cam1.get(CV_CAP_PROP_FRAME_HEIGHT);
cv::Size frameSize(static_cast<int>(Width), static_cast<int>(Height));
VideoWriter cam1_write(videoFileName, CV_FOURCC('D', 'I', 'V', '3'), 10.0, frameSize, true);

这意味着您要编写具有VideoCapture图像大小的视频。

在这里你必须换成

cv::Size targetSize = cv::Size(320,240);
VideoWriter cam1_write(videoFileName, CV_FOURCC('D', 'I', 'V', '3'), 10.0, targetSize, true);

现在使用

    resize(image, image, targetSize);

这意味着在创建VideoWriter时,您必须决定您想要的输出图像大小。这是因为典型的编解码器假定恒定(已知)的图像分辨率。

为了设置分辨率,你有一些打字错误:

cap_cam1.set(CV_CAP_PROP_FRAME_WIDTH, 240);
cap_cam1.set(CAP_PROP_FRAME_HEIGHT,320);

这意味着cv::Size(240,320)的分辨率,因此如果您将那里的顺序更改为cv::Size(320,240),您的代码可能会工作。参见@MBo 的评论