我正在尝试阅读avi视频,并在MAC 10.6.8上使用openCV 2.4.0进行重新编写,而不做任何更改
我的视频是灰度的,frame_rate = 25,编解码器= 827737670,这是FFV1(我猜)
问题是...... 当我读取和写入视频时......我看到大小和颜色有很多变化...... 写完3到4次后,我可以看到视频开始是(粉红色)!!!!
我不确定是什么问题!!!
这是我感兴趣的人的代码
提前感谢您的帮助:D
Seereen
注意:我的计算机上有FFMPEG V 0.11(我不知道这是否重要)
{
int main (int argc, char * const argv[]) {
char name[50];
if (argc==1)
{
printf("\nEnter the name of the video:");
scanf("%s",name);
} else if (argc == 2)
strcpy(name, argv[1]);
else
{
printf("To run this program you should enter the name of the program at least, or you can enter the name of the program then the file name");
return 0;
}
cvNamedWindow( "Read the video", CV_WINDOW_AUTOSIZE );
// GET video
CvCapture* capture = cvCreateFileCapture( name );
if (!capture )
{
printf( "Unable to read input video." );
return 0;
}
double fps = cvGetCaptureProperty( capture,CV_CAP_PROP_FPS);
printf( "fps %f ",fps );
int codec = cvGetCaptureProperty( capture,CV_CAP_PROP_FOURCC);
printf( "codec %d ",codec );
// Read frame
IplImage* frame = cvQueryFrame( capture );
// INIT the video writer
CvVideoWriter *writer = cvCreateVideoWriter( "x7.avi", codec, fps, cvGetSize(frame),1);
while(1)
{
cvWriteFrame( writer, frame );
cvShowImage( "Read the video", frame );
// READ next frame
frame = cvQueryFrame( capture );
if( !frame )
break;
char c = cvWaitKey(33);
if( c == 27 )
break;
}
// CLEAN everything
cvReleaseImage( &frame );
cvReleaseCapture( &capture );
cvReleaseVideoWriter( &writer );
cvDestroyWindow( "Read the video" );
return 0;}
}
答案 0 :(得分:3)
选中此list of fourcc codes,然后搜索未压缩的内容,例如HFYU
。
你也可能会发现这篇文章很有趣:Truly lossless video recording with OpenCV。
修改强>
我有一台Mac OS X 10.7.5可供您使用,因为您提供了测试视频,我决定分享我的发现。
我为测试目的编写了以下源代码:它会加载您的视频文件并将其写入新文件 out.avi ,同时保留编解码器信息:
#include <cv.h>
#include <highgui.h>
#include <iostream>
int main(int argc, char* argv[])
{
// Load input video
cv::VideoCapture input_cap(argv[1]);
if (!input_cap.isOpened())
{
std::cout << "!!! Input video could not be opened" << std::endl;
return -1;
}
// Setup output video
cv::VideoWriter output_cap("out.avi",
input_cap.get(CV_CAP_PROP_FOURCC),
input_cap.get(CV_CAP_PROP_FPS),
cv::Size(input_cap.get(CV_CAP_PROP_FRAME_WIDTH), input_cap.get(CV_CAP_PROP_FRAME_HEIGHT)));
if (!output_cap.isOpened())
{
std::cout << "!!! Output video could not be opened" << std::endl;
return -1;
}
// Loop to read from input and write to output
cv::Mat frame;
while (true)
{
if (!input_cap.read(frame))
break;
output_cap.write(frame);
}
input_cap.release();
output_cap.release();
return 0;
}
输出视频呈现出与输入相同的特征:
玩的时候看起来很好。
我正在使用OpenCV 2.4.3。
答案 1 :(得分:1)
我找出问题,,,,, 以YUV240像素格式编写的原始视频(并且是灰色的)
openCV默认读取BGR上的视频,所以每当我读取它时openCV将像素值转换为BGR
经过几次读写后,错误开始变大(因为转换操作) 为什么像素值会改变.....我看到视频粉红色!解决方案是,FFMPEG项目读取和写入这种视频,提供YUV240和许多其他格式 有一个代码可以在FFMPEG教程中执行此操作
我希望这可以帮助面临类似问题的其他人