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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于OpenCV C++写了一个截屏程序,但是当视频总帧数为截屏间隔整数倍时候 死循环相关的知识,希望对你有一定的参考价值。

int DeVideo(char*videoNam, int fpsNum)

int flag;//该变量为了判断是否进行了完整的截图循环
int count = 0; //文件编号开始计数值
char filename[13];
CvCapture * capture = cvCaptureFromFile(videoNam);//打开视频文件
if (capture == NULL)printf("Could not load video file\n");//如果没有成功载入
IplImage * frame;
while (1)

for (int i = 0; i < fpsNum; i++)

frame = cvQueryFrame(capture);
if (!frame)break;
flag = i;

if (flag<fpsNum - 1)break;
if (count <= 9)

sprintf(filename, "0000000%d.bmp", count++);
printf("ImgNum %d\n Name 0000000%d.bmp\n", count, count - 1);

else if (count <= 99 && count >= 10)

sprintf(filename, "000000%d.bmp", count++);
printf("ImgNum %d\n Name 000000%d.bmp\n", count, count - 1);

else if (count <= 999 && count >= 100)

sprintf(filename, "00000%d.bmp", count++);
printf("ImgNum %d\n Name 00000%d.bmp\n", count, count - 1);

else if (count <= 9999 && count >= 1000)

sprintf(filename, "0000%d.bmp", count++);
printf("ImgNum %d\n Name 0000%d.bmp\n", count, count - 1);

else if (count <= 99999 && count >= 10000)

sprintf(filename, "000%d.bmp", count++);
printf("ImgNum %d\n Name 000%d.bmp\n", count, count - 1);

else if (count <= 999999 && count >= 100000)

sprintf(filename, "00%d.bmp", count++);
printf("ImgNum %d\n Name 00%d.bmp\n", count, count - 1);

else if (count <= 9999999 && count >= 1000000)

sprintf(filename, "0%d.bmp", count++);
printf("ImgNum %d\n Name 0%d.bmp\n", count, count - 1);

else

sprintf(filename, "%d.bmp", count++);
printf("ImgNum %d\n Name %d.bmp\n", count, count - 1);

cvSaveImage(filename, frame);

cvReleaseCapture(&capture);
return count;//返回图片数目

这么多if else是为了对所截图片按照预先设定好的命名

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;
参考技术A / /截图
的UIImage *快照;

CGImageRef cgScreen = UIGetScreenImage();

如果(cgScreen)

快照= [UIImage的imageWithCGImage:cgScreen];

CGImageRelease( cgScreen);



的CGRect RECT = CGRectMake(0,125,640,750);/ /创建要砍你可以自己

的UIImage * RES =矩形[UIImage的imageWithCGImage:CGImageCreateWithImageInRect([快照的CGImage],矩形)]
/ / RES是后br的UIImage br出手试试吧追问

这是啥

项目基于 SpringMvc + OpenCV 的答题卡识别系统

简介

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,它提供了一系列图像处理和计算机视觉方面很多通用算法。是研究图像处理技术的一个很不错的工具。最初开始接触是2016年因为公司项目需要,但是当时网上可供参考的 demo 实在太少了,而且基本上都是基于C、C++实现的。也就是从 2017 年开始,关于 java+opencv 的资料才渐渐多起来。处于这种情况,就想搭建一个有助于我们学习和了解 opencv 的一个平台。因此就有了这个系统。从安装开始,和大家一起学习记录 OpenCV 的相关知识,直至最终一个简单但完整 DEMO 的实现(答题卡识别)。

软件架构

SpringMVC+AdminLTE 2+maven。考虑到之前 demo 测试,要么都是生成图片查看效果,要么用 swing 绘制,遇到参数变化的时候,不便于调试,于是就做成了大家熟悉的 web 模式。后台是基于 SpringMVC,也没有数据库交互,就是个页面操作效果实时查看的功能,现在很简单。前端使用的是AdminLTE 2,一个基于 bootstrap 的轻量级后台模板。

主要内容

  • 图像二值化

  • 图像自适用二值化

  • 高斯模糊

  • 图片缩放

  • 腐蚀膨胀

  • 进阶形态学变换

  • 边缘检测

  • 检测直线

  • 检测圆

  • 检测颜色

  • 轮廓识别

  • 模板查找

  • 绘制灰度直方图

  • 答题卡识别demo

系统效果

【项目】基于 SpringMvc + OpenCV 的答题卡识别系统

【项目】基于 SpringMvc + OpenCV 的答题卡识别系统

项目源码:gitee.com/songer/java_opencv


● 关字 ●

●●● 回复下方关键字即可获取链接  ●●●

回复【基础】获取Java零基础入门到精通系统培训课程

回复【2020】获取Java从前端到后端全栈工程师实战课程视频教程

回复【1024】获取Java学习视频源代码笔记课件练习题项目面试题面试技巧等

回复【BAT】获取BAT等大厂Java面试经验总结含大厂面试题

回复【500】获取500套Java实用代码,如Java博客项目,工具类、小程序

回复【激活码】IDEA 2020.3激活码,亲测成功

回复【项目】获取上百套Java企业实战项目

回复【电子书】获取电子书资源

回复【Java】获取Java最新学习资料

回复【大数据】获取大数据最新学习资料

回复【python】获取python最新学习资料

回复【web前端】获取web前端最新学习资料

回复【软件测试】获取软件测试最新学习资料

回复【人工智能】获取人工智能最新学习资料

回复【毕业设计】获取100+套毕业设计项目资料


以上是关于基于OpenCV C++写了一个截屏程序,但是当视频总帧数为截屏间隔整数倍时候 死循环的主要内容,如果未能解决你的问题,请参考以下文章

findcontours 断言失败

C++编写截屏软件(ScreenCapture_v1.0.0)

一个基于OCV的人肉选取特征点程序

OpenCV + visualStudio,尝试访问像素的 C++ 代码错误

基于变化角的Opencv C++裁剪图像

C++基于 OpenCV 的人脸识别(强烈推荐)