基于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是为了对所截图片按照预先设定好的命名
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
系统效果
项目源码: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++写了一个截屏程序,但是当视频总帧数为截屏间隔整数倍时候 死循环的主要内容,如果未能解决你的问题,请参考以下文章
C++编写截屏软件(ScreenCapture_v1.0.0)