以下是我使用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;
}
答案 0 :(得分: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
}
答案 1 :(得分:5)
通常这不是FOURCC问题。这里的问题是img的大小和用于打开VideoWriter的大小是不同的。
这样你应该确保IPLImages或Mat图像和VideoWriter具有相同的大小,否则视频输出将是错误的。
答案 2 :(得分: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);
它有效!
不要忘记初始化变量filename
和int i
。
希望它有所帮助!