关于openCV的--CvSetCaptureProperty设置无效的情况

Fordawn 2013-04-18 10:17:43
最近看《学习openCV》,在做视频播放控制的滚动条时,出现了滚动条无法准确控制视频进度的情况--
代码不多,我就贴在下面:
------------------------------------------------------------------------------------------------
1、#include "cv.h"
2、#include "highgui.h"
3、#include <iostream>
4、using namespace std;
------------------------------------------------------------------
5、//保存滑块位置信息的全局变量
6、int g_slider_position = 0;

7、//定义一个CvCapture结构的全局变量,并初始化为空
8、CvCapture * g_capture = NULL;
------------------------------------------------------------------
9、//滑块回调函数,传入位置参数
10、void onTrackbarSlide(int pos)
11、{
12、 //改变CvCapture结构中的当前帧
13、 //设置结构属性
14、 //属性id--CV_CAP_PROP_POS_FRAMES,pos是属性的值,即将pos帧(单位)位置的帧设置为当前Capture结构
/*--------------------------怀疑出现问题的函数-----------------------------------*\
15、 cvSetCaptureProperty( g_capture,CV_CAP_PROP_POS_FRAMES,g_slider_position);
\*-----------------------------以下是为了检查而添加的----------------------------*/
16、 //double num;
17、 //num = cvGetCaptureProperty(g_capture,CV_CAP_PROP_POS_MSEC);
18、 //cout<<num<<endl;
19、 //通过属性查询,发现当前帧是0,猜测是设置属性失败--
20、 //cout<<g_slider_position<<endl;
21、}
--------------------------------------------------------------------
22、int main(int argc,char ** argv)
23、{
24、 //创建显示窗口,解决在哪里显示的问题
25、 cvNamedWindow("PlayerWithSlider",1);

26、 //异常处理,当输入格式不对,或者视频文件为空时,程序退出
27、 if(argc == 2 && cvCreateFileCapture(argv[1]) != 0)
28、 {
29、 //将视频文件信息载入,初始化为文件的开头
30、 g_capture = cvCreateFileCapture(argv[1]);
31、 //获取总帧数,并保存到变量中
32、 //查询结构属性(当前结构保存了视频文件)
33、 int frames = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);
34、 //声明一个指向IPL结构的指针,用以指示要显示的当前帧
35、 IplImage * frame;

36、 //创建滑块
37、 //检查返回值
38、 if(frames != 0)
39、 {
40、 //指定回调函数,绑定位置变量
41、 //滑块设定好后的两个自动
42、 //-- 1,当滑块被拖动时,自动将当前位置传给g_slider_position
43、 //-- 2,当滑块被拖动时,自动调用回调函数
44、 //g_slider_position也指定了滑块创建时的位置
45、 cvCreateTrackbar("positon",
"PlayerWithSlider",
&g_slider_position,
frames,onTrackbarSlide);
46、 }
47、 //播放循环
48、 while(1)
49、 {
50、 //cout<<g_slider_position<<endl; -->根据该函数说明g_slider_position确实被改变了
51、 //查询帧,用来将下一帧视频文件载入CvCapture结构中
52、 frame = cvQueryFrame(g_capture);
53、 //显示当前帧图像
54、 cvShowImage("PlayerWithSlider",frame);
55、 //播放到末尾时,跳出循环
56、 if(frame == 0) break;
57、 //当用户按ESC时,退出
58、 char c = cvWaitKey(33);
59、 if(c == 27) break;
60、 }
61、 //善后处理
62、 cvReleaseCapture(&g_capture);
63、 cvDestroyWindow("PlayerWithSlider");
64、 }
65、 return 0;
66、}
------------------------------------------------------------------------------------------------
我自己查了半天,发现cvCreateTrackbar是没问题,全局变量g_slider_position的值确实被改变了,回调函数也被触发了--
因此,我最后检查回调函数,发现在cvSetCaptureProperty之后,用cvGetCaptureProperty查视频现在的播放位置,始终是第0帧-- 这不得不让我想起全局变量g_slider_position的初始值为0--
这是否表示设置属性失败? 求大神指教
...全文
3054 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fordawn 2013-04-18
  • 打赏
  • 举报
回复
问题已经解决,是版本问题-- 以前用的是2.31更新为2.45后,就没事了

1,552

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与英特尔开源软件相关的技术
社区管理员
  • 英特尔开源软件社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧