基于OpenCV C++写了一个截屏程序,但是当视频总帧数为截屏间隔整数倍时候 死循环

基于OpenCV C++写了一个截屏程序,但是当视频总帧数为截屏间隔整数倍时候 死循环,第1张

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怎样修改视频中图像的像素值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10130299.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存