在OpenCV中将非标准分辨率的帧写入视频

时间:2018-06-22 08:40:49

标签: python opencv video-recording

关于这个问题:OpenCV VideWriter not working after image resize

是否可以使用opencv的cv2.VideoWriter创建具有“非标准”视频分辨率(即非标准长宽比)的视频?到目前为止,我的代码:

fourcc = cv2.VideoWriter_fourcc(*'XVID')
video_out = cv2.VideoWriter("video_out.avi", fourcc, 25, (99, 173))

cap = cv2.VideoCapture("video_in.avi")

while(cap.isOpened()):
    ret, frame = cap.read()
    frame_out = frame[50:50+173,400:400+99]      
    video_out.write(frame_out) 
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

我也尝试了其他视频格式(H264,MJPG),但没有成功。

编辑:没有成功,表示创建了输出视频,但仍为空。如果我使用原始帧大小,则会将帧写入视频。

编辑:Micka的答案有效,但是我现在也可以运行我的python代码:彩色视频输出的布尔参数丢失了。

   video_out = cv2.VideoWriter("video_out.avi", fourcc, 25, (99, 173), False)

3 个答案:

答案 0 :(得分:3)

对于我来说,此代码确实有效,但是MJPG确实将奇数分辨率四舍五入为偶数分辨率。 H264根本无法使用该分辨率。

int main(int argc, char* argv[])
{
    // start camera
    cv::VideoCapture cap(0);

    // read a single image to find camera resolution
    cv::Mat image;
    cap >> image;
    if (image.empty())
    {
        std::cout << "Could not find/open camera. Press Enter to exit." << std::endl;
        std::cin.get();
        return 0;
    }

    cv::Size targetSize(199, 171);
    cv::VideoWriter writer("out.avi", CV_FOURCC('M','J','P','G'), 25, targetSize, true); // does create a 198x170 video file.
    //cv::VideoWriter writer("out.avi", -1, 25, targetSize, true); // does not work for x264vfw for example with an error message.


    while (cv::waitKey(30) != 'q')
    {
        cap >> image;
        if (!image.empty())
        {
            cv::imshow("captured image", image);

            // resize the actual image to a target size
            cv::Mat writableImage;
            cv::resize(image, writableImage, targetSize);

            writer.write(writableImage);
        }
    }


    // release the camera
    cap.release();
    writer.release();

    std::cout << "Press Enter to exit." << std::endl;
    std::cin.get();

    return 0;
}

通常,许多编解码器仅限于某些像素块约束,例如在每个维度上具有2、4、8、16或32的倍数。要么是因为算法本身,要么是由于硬件指令的优化。

答案 1 :(得分:0)

cv2.VideoWriter("video_out.avi", fourcc, 25, (173, 99))为尺寸为173x99(宽x高)的框架创建书写器。

frame_out是一帧尺寸为99x173的帧(该帧的索引为[y,x])。

更改索引以写入匹配的帧大小。

答案 2 :(得分:0)

在OSX环境中:

  • OSX:高山脉(10.13.6)
  • Python:3.6.3
  • 打开CV(使用预构建的python pck):opencv-python-headless 4.1.0.25

最适合我的组合是mp4包装器(OSX不喜欢avi)和mp4v编解码器。也尝试过avc1,但不会写出非标准尺寸的框架

codec = 'mp4v'
fourcc = cv2.VideoWriter_fourcc(*codec)
size = ( 1000 , 500 )
fps = 15
writer = cv2.VideoWriter('filename.mp4', fourcc, fps, size, True)