初学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) |