您的位置:首页 > 编程语言 > Qt开发

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系统上容易出现重复帧的错误
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: