【问题标题】:Save mp4 video opencv保存mp4视频opencv
【发布时间】:2020-09-24 10:54:13
【问题描述】:

我有 mp4 视频,画完后我需要保存它。 我正在尝试使用

VideoWriter video("outcpp.avi", CV_FOURCC('M', 'J', 'P', 'G'), 10, Size(1280, 720));

但是保存后这个文件坏了。 完整代码(我使用的是 opencv 2.4.13):

#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
using namespace std;
using namespace cv;
Mat src;
void mouse_callback(int event, int x, int y, int, void*)
{
    if (event == EVENT_LBUTTONDOWN)
    {
        rectangle(src, Point(x, y), Point(x+10, y+10), Scalar(0, 255, 0));
        imshow("src", src);
    }
}

int main(void)
{       
    CvCapture* cap = cvCreateFileCapture("1.mp4");
    VideoWriter video("outcpp.avi", CV_FOURCC('M', 'J', 'P', 'G'), 10, Size(1280, 720));
    while (1)
    {
        src = cvQueryFrame(cap);
        namedWindow("src", WINDOW_AUTOSIZE);
        imshow("src", src);
        setMouseCallback("src", mouse_callback);
        video.write(src);
        waitKey(0);
    }

    return 0;
}

【问题讨论】:

  • 当你说它坏了是什么意思?你如何尝试阅读它?此外,您不需要在每一帧上调用setMouseCallback,只需使用namedWindow("src") 创建“src”窗口并在进入循环之前设置鼠标回调。再说一句:你为​​什么要记录你正在阅读的同一帧?如果您想记录您绘制的矩形,请确保不是这种情况。
  • 这段代码给了我src = cvQueryFrame(cap) 的错误,你没有使用videocapture() 吗?这个 api 不是 c++ 吗?请编辑您的问题
  • @YunusTemurlenk 我不得不说它是 opencv 2.4.13
  • @antoine 我正在尝试打开保存的文件,但它显示错误,该文件已损坏。你的意思是我不能用这个来保存带有矩形的视频?
  • 这与版本无关。您的 c++ 标签错误,您应该编辑问题

标签: c opencv


【解决方案1】:

Seams 一切都在使用 VideoCapture。为什么使用 C 接口进行读取,使用 C++ 进行写入?

我只在等待键后移动video.write 以捕获用户在视频中的点击。

int main(void)
{
    vector<Rect> trafficLights;

    VideoCapture cap("/Users/alex/Documents/my_projects/hahaton_cams/kfu2.mp4");
    VideoWriter video("outcpp.avi", CV_FOURCC('M', 'J', 'P', 'G'), 10, Size(1280, 720));
    while (cap.read(src)) {
        namedWindow("src", WINDOW_AUTOSIZE);
        imshow("src", src);
        setMouseCallback("src", mouse_callback);

        if (waitKey(0) == 'q')
            break;
        video.write(src); // to capture user clicks
    }

    return 0;
}

OpenCV 4.2

【讨论】:

  • 也许您应该在videowrite之前添加添加waitKey()的原因?它的 cos 是录像机在绘图之前拍摄前一帧。
  • > 我只在等待键后移动video.write 以捕获视频中的用户点击。没有它,这段代码只需编写视频,无需用户点击。
  • 好吧,你的代码是对的。我只是希望您将原因添加为编辑。错误在于,但原因是:videowriter 将使用纯帧而不是在问题方面处理帧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2019-07-11
  • 2015-12-05
相关资源
最近更新 更多