1

这是我使用 OpenCV 从图像创建视频的示例程序。但是我的输出视频无法正常工作,并且发生错误并指出“无法解复用流”请帮助。

  #include<cv.h>
  #include<highgui.h>
  #include<cvaux.h>
  #include<cxcore.h>

  int main()
{
    //CvVideoWriter *writer = 0;
    int isColor = 1;
    int fps     = 25;  // or 30
    int frameW  = 320; // 744 for firewire cameras
    int frameH  = 240; // 480 for firewire cameras
    CvSize size;

    size.width = frameW;
    size.height = frameH;
    CvVideoWriter *writer = cvCreateVideoWriter(
            "data3.avi",
            CV_FOURCC('M','J','P','G'),
            fps,
            size);
    IplImage* img = 0; 
    img=cvLoadImage("IMG_0157.JPG");
    for(int counter=0;counter < 3000;counter++)
    {
    cvWriteFrame(writer,img);      // add the frame to the file
    }
    cvReleaseVideoWriter(&writer);
    return 0;
}
4

3 回答 3

6

您可以尝试不同的 FOURCC 代码。OpenCV 不正确支持其中一些,多媒体应用程序不正确支持其中一些。拥有一个同时适用于 OpenCV 和您最喜欢的视频播放器的软件是一个反复试验的问题。

您可以尝试什么:使用 VLC(以防您不使用它)。它是最强大的玩家之一。

如果您只想在 OpenCV 中将图像序列显示/处理为视频,则可以使用 VideoCapture 的未记录功能:加载图像序列。

该示例使用 C++,但您可以轻松地将其转换为 C。

// pics are a sequence of Pictures001.jpg, PicturesS002.jpg, etc
cv::VideoCapture cap("path/to/my/Pictures%03d.jpg");

cv::Mat frame;

for(;;)
{
    cap >> frame;
    if(frame.empty())
       break;

    // do some processing
}
于 2012-06-21T06:14:25.130 回答
5

通常这不是 FOURCC 问题。这里的问题是img的大小和打开VideoWriter的大小不同。

这样你应该确保IPLImages或Mat图像,和VideoWriter具有相同的大小,否则视频输出会出错。

于 2012-11-21T11:04:57.690 回答
1

我也在尝试从多个图像创建视频。我不明白,但您是要加载单个图像吗?

IplImage* img = 0; img=cvLoadImage("IMG_0157.JPG");

我在处理视频时遇到了一些问题,因为我没有获得我试图加载以创建视频的图像的宽度和高度。所以我首先得到了这些属性:

IplImage *img = cvLoadImage("<folder>\\<image_name>.jpg");

size.width = img->width;
size.height = img->height;

然后创建视频编写器并检查它是否存在:

CvVideoWriter *writer = cvCreateVideoWriter(
    "<video_name>.avi",
    -1,//CV_FOURCC('I','Y','U','V'), // VIDEO CODEC
    fps,
    size);

if(writer == NULL)
    std::cout << "No videowrite here!" << '\nl';

并将找到的每个图像写入视频的框架,然后将其发布。

while(img!=NULL)
{
    sprintf( filename, "<folder>\\<image_name>_%d.jpg", i );

    img = cvLoadImage(filename); //imagem b&w
    cvWriteFrame(writer,img);

    i++;
}

cvReleaseVideoWriter(&writer);
cvReleaseImage(&img);

它奏效了!

不要忘记初始化变量filenameint i.

希望它有所帮助!

于 2013-03-27T17:44:33.693 回答