Chinaunix首页 | 论坛 | 博客
  • 博客访问: 60833
  • 博文数量: 10
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-06 19:25
文章分类

全部博文(10)

文章存档

2011年(1)

2010年(1)

2009年(8)

我的朋友

分类: C/C++

2009-12-21 19:04:30

初学Opencv,一步步走,希望与同样对Opencv感兴趣的读者交流经验,如发现错误,希望指出,只求进步。
 
这是一个小例子,用滚动条控制视频的播放,实现视频与滚动条的同步。
1、程序之前的配置、准备工作
下面的配置使用于还没有配置系统环境变量的情况,仅供参考,这样配置的目的主要是为了学习、开发项目方便。
我是在f盘下建立一个Opencv的文件夹,以后所有Opencv的项目都放在这个目录下。在F:/Opencv/目录下创建bin、include、lib、Output四个文件夹。
bin:把Opencv中debuge版本和release版本的动态库都移近来,之后我们把要产生的.exe文件也放置在这个目录下。
lib:把Opencv中debuge版本和release版本的静态库都移近来。
include:把Opencv中头文件都移近来
Output:通过项目配置,让项目编译过程中产生的中间文件都放置在这里。因为项目编译构成中必然会产生一些中间文件,而我们大多时候并不关心这些文件,为了让我们的项目文件简洁,所以我们指定中间文件都生成在这里。
开始创建项目,项目创建好后配置项目属性:如下:
配置属性->常规->输出目录:F:\OpenCv\bin\
配置属性->常规->中间目录:F:\OpenCv\OutPut\$(ProjectName)
配置属性->链接器->常规->输出目录:F:\OpenCv\bin\$(ProjectName).exe
 
配置Ok,开始程序。
2、代码如下:
#include "F:\OpenCv\include\highgui.h"
#include "F:\OpenCv\include\cv.h"   //头文件指定寻找路径
#ifdef _DEBUG
#pragma comment(lib, "F:/OpenCv/lib/highgui200d.lib")
#pragma comment(lib, "F:/OpenCv/lib/cv200d.lib") //指定静态库文件的寻找路径
#else
#pragma comment(lib, "F:/OpenCv/lib/highgui200.lib")
#pragma comment(lib, "F:/OpenCv/lib/cv200d.lib")
#endif
int g_slider_position =0;        //滚动条位置
CvCapture* g_capture = NULL;     //指向CvCapture结构的指针,这个结构包含了所有关于要读入AVI文件的信息
//定义一个回调函数
void onTrackbarSlide(int pos)
{
 cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);
 //设置CvCapture对象的属性:根据pos位置来设置g_capture的读入位置
 //CV_CAP_PROP_POS_FRAMES:以帧数来设置读入位置
}
int main(){
 cvNamedWindow("PlayAVI", CV_WINDOW_AUTOSIZE);
 //在屏幕上创建一个标题为PlayAVI的窗口,根据窗口内容自动调整窗口大小
 g_capture = cvCreateFileCapture("test.avi");
 int frames = (int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);
 //获得CvCapture对象的属性:返回g_capture的总帧数
 if(frames){
  cvCreateTrackbar("Position", "PlayAVI", &g_slider_position, frames, onTrackbarSlide);
  /*创建滚动条,
  参数1:创建的滚动条的名字
  参数2:显示滚动条的窗口的名字
  参数3:反映滚动条位置的整型变量
  参数4:滚动条的最大位置(这里就是AVI文件的总帧数)
  参数5:回调函数,滚动条位置改变时会回调这个函数
  */
 }
 
 IplImage* frame;
 while(1){
  frame = cvQueryFrame(g_capture);
  //frame 指向g_capture指向的AVI文件的当前读入帧
  //滚动条的回调函数就是通过vSetCaptureProperty()来改变当前读入帧的位置来改变frame的
  if(!frame) break;
  cvSetTrackbarPos("Position", "PlayAVI", g_slider_position++);
  /*设置滚动条的位置,实现视频与滚动条的同步
  参数1:滚动条的名字
  参数2:显示滚动条的窗口的名字
  参数3:传入滚动条的位置
  */
  cvShowImage("PlayAVI", frame);
  //图片显示在标题为"PlayAVI"的窗口内
  char c = cvWaitKey(20);
  if(c == 27) break;//如果按下esc键(ASCII值27),则退出
 }
 cvReleaseCapture(&g_capture);//释放g_capture指向的AVI文件资源
 cvDestroyWindow("PlayAVI");//销毁"PlayAVI"窗口
 return 0;
}
 
 
 
阅读(3265) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-04-26 20:35:29

有个问题请教!我用你的方法试了下,好像滚动条不会随着视频播放移动,当把g_slider_position++改为++g_slider_position就可以了,请教下是为什么?