Opencv + Qt 获取视频中任意一帧
2015-08-25 00:11
429 查看
opencv + Qt + Sqlite
Sqlite 保存文件名路径通过Qt 的 QSqlDatabase 进行文件路径读取
转成 std::string, 传到 opencv 中的 VideoCapture
获取视频中任意一帧的代码
Mat getFrame(string avipath,int id){ Mat frame; VideoCapture capture(avipath); capture.set(CV_CAP_PROP_POS_FRAMES,id); if(!capture.grab()){ cout<<"grab in opencv failed!"<<endl; return frame; } capture>>frame; return frame; }
保存图片某一区域的代码
imwrite(filename,frame(Range(b.x1,b.x2),Range(b.y1,b.y2)));
关于帧的问题
用cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT)获得的总帧数通常比视频的总帧数要少。因为如果有重复的帧,它就不会统计。// 可能会导致全黑图片出现 Mat getFrame(string avipath,int id){ cout<<"a bad way to get Frame"<<endl; Mat frame; VideoCapture capture(avipath); capture.set(CV_CAP_PROP_POS_FRAMES,id-1); if(!capture.grab()){ cout<<"grab in opencv failed!"<<endl; return frame; } capture>>frame; return frame; }
关于VideoCapture
VideoCapture 的读取判断函数均会改变CV_CAP_PROP_POS_FRAMES如 grab(), read(), >>
准确的做法:一帧一帧读,直到目标帧
int VideoPos=0; //初始视频读到的位置,每读一帧,VideoPos加一 while(frameNum>=VideoPos){ capture>>frame; VideoPos++; if(frame.empty()){ cout<<"MyOpencv::extractObject frame is empty!"<<endl; return ; } }
一个可能的opencv bug,待确认
-对同一个视频文件,同样的代码- 在32位windows7系统上并没有出现重复帧的错误
- 在64位windows7系统上容易出现重复帧的错误
相关文章推荐
- Qt QWidget右键菜单实例
- Qt 窗体布局
- qt超强绘图控件qwt - 安装及配置
- Qt 常用类 (10)—— QDialog
- Qt入门-下拉列表框QComboBox类
- QTcpSocket 编程
- Qt Animation
- Qt之界面实现技巧
- Qt之QTextEdit
- Qt之设置窗口背景
- Qt进程间共享内存例子
- QT中QWidget、QDialog及QMainWindow的区别
- Qt实现基本QMainWindow主窗口程序
- 关于Qt几个问题的答案
- PyQt5学习随笔01--计算一个文件夹里我们码的代码行数&&PyQt的多线程通信
- Qt QTreeWidget 树形结构实现
- 发布MQTT消息究竟有多快?
- mqtt,Could not connect: CONNECTION_REFUSED_NOT_AUTHORIZED
- Qt中如何利用QPushButton来实现一个弹出菜单
- 借贷宝推广得现金是真的_注册就送人民币20元_邀请码CRJYQTK