【问题标题】:OpenCV VideWriter not working after image resize图像调整大小后 OpenCV VideWriter 无法正常工作
【发布时间】:2015-12-18 05:24:41
【问题描述】:

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

这是我的代码:

#include"opencv2\opencv.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 定义处更改分辨率。

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

【问题讨论】:

  • 您是否混淆了 240x320 和 320x240 分辨率?
  • 而不是VideoWriter cam1_write(videoFileName, CV_FOURCC('D', 'I', 'V', '3'), 10.0, frameSize, true); 使用VideoWriter cam1_write(videoFileName, CV_FOURCC('D', 'I', 'V', '3'), 10.0, cv::Size(320,240), true); 使用那里的目标大小(您要调整到的大小)... VideoWriter 只允许写入一个目标大小。

标签: c++ opencv visual-studio-2012 image-processing video-recording


【解决方案1】:

你正在使用

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 的评论

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多