for (int i = 0; i < fpsNum; i++)
{
frame = cvQueryFrame(capture);
if (!frame)break;
flag = i;
}
问题出在这里
if (!frame)break;
这个break只是中断了for循环
当i为0,即刚进入for循环,视频就达到了最后一帧,则flag还没有在此次for循环赋值就跳出了,而此时flag的值为上一次for循环的最后一次赋值,即 fpsNum-1,导致这一句的break无法执行:if (flag<fpsNum - 1)break
可以这样改:
while (1)
{
bool flag = false;
for (int i = 0; i < fpsNum; i++)
{
frame = cvQueryFrame(capture);
if (!frame)
{
flag = true;
break;
}
}
if(flag)break;
(此处省略)
cvSaveImage(filename, frame);
}
还有个更简单的修改方法可以试一下
在for循环之前即这句话:for (int i = 0; i < fpsNum; i++)
之前对flag进行一次赋值,flag = 0;
// 该程序实现视频和的相互转换
// Image_to_video()函数将一组合成AVI视频文件
// Video_to_image()函数将AVI视频文件读入,将每一帧存储为jpg文件
//
////////////////////////////////////////////////////////////////////////
#include <stdlibh>
#include <stdioh>
#include <mathh>
#include <cvh>
#include <highguih>
#define NUM_FRAME 300 //只处理前300帧,根据视频帧数可修改
void Video_to_image(char filename)
{
printf("------------- video to image ----------------\n");
//初始化一个视频文件捕捉器
CvCapture capture = cvCaptureFromAVI(filename);
//获取视频信息
cvQueryFrame(capture);
int frameH = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
int frameW = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
printf("\tvideo height : %d\n\tvideo width : %d\n\tfps : %d\n\tframe numbers : %d\n", frameH, frameW, fps, numFrames);
//定义和初始化变量
int i = 0;
IplImage img = 0;
char image_name[13];
cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );
//读取和显示
while(1)
{
img = cvQueryFrame(capture); //获取一帧
cvShowImage( "mainWin", img ); //将其显示
char key = cvWaitKey(20);
sprintf(image_name, "%s%d%s", "image", ++i, "jpg");//保存的名
cvSaveImage( image_name, img); //保存一帧
if(i == NUM_FRAME) break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("mainWin");
}
void Image_to_video()
{
int i = 0;
IplImage img = 0;
char image_name[13];
printf("------------- image to video ----------------\n");
//初始化视频编写器,参数根据实际视频文件修改
CvVideoWriter writer = 0;
int isColor = 1;
int fps = 30; // or 25
int frameW = 400; // 744 for firewire cameras
int frameH = 240; // 480 for firewire cameras
writer=cvCreateVideoWriter("outavi",CV_FOURCC('X','V','I','D'),fps,cvSize(frameW,frameH),isColor);
printf("\tvideo height : %d\n\tvideo width : %d\n\tfps : %d\n", frameH, frameW, fps);
//创建窗口
cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );
while(i<NUM_FRAME)
{
sprintf(image_name, "%s%d%s", "image", ++i, "jpg");
img = cvLoadImage(image_name);
if(!img)
{
printf("Could not load image file\n");
exit(0);
}
cvShowImage("mainWin", img);
char key = cvWaitKey(20);
cvWriteFrame(writer, img);
}
cvReleaseVideoWriter(&writer);
cvDestroyWindow("mainWin");
}
int main(int argc, char argv[])
{
char filename[13] = "infileavi";
Video_to_image(filename); //视频转
Image_to_video(); //转视频
return 0;
}
//---------------------------------------------------
处理视频是一帧一帧来做的(你可以随便找一个视频处理的例子在上面改),每一帧就是一张图IplImage,所以你只要处理每一张图就行了,最后再把处理好的图写进视频里面就保存下来了。对于一幅修改像素值你应该会的吧,可以用漫水填充法也就是cvfloodfill来做,这个可以填充连通域或者你设定的mask,具体方法你查下手册吧。
以上就是关于基于OpenCV C++写了一个截屏程序,但是当视频总帧数为截屏间隔整数倍时候 死循环全部的内容,包括:基于OpenCV C++写了一个截屏程序,但是当视频总帧数为截屏间隔整数倍时候 死循环、如何利用opencv 从一段AVI视频中获取每一帧的图像、opencv怎样修改视频中图像的像素值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)