opencv从入门到精通(1)-创建自己的视频播放器
2016-01-20 10:54
435 查看
本文默认你已经成功配置opencv并具有一定的c++基础,后续将由浅入深地介绍如何运用opencv进行图像处理与机器学习的具体实践,在熟悉opencv的同时也能对相关理论有更深刻的理解。opencv的具体配制方法参见:http://www.cnblogs.com/woshitianma/p/3853447.html。
代码如下:
第一个程序——展示一个图像
c++中通过文件流可以将图像从磁盘中读入,处理后再输出到磁盘,但无法在屏幕上显示,运用opencv中的HighGUI工具箱则可以达到屏幕上及时显示的效果。 首先在visual studio中创建一个空的win32项目,新建一个cpp文件,输入下面的代码,并将图像文件放到项目的文件目录中。在解决方案资源管理器中可以打开项目所在文件夹。
代码如下:
#include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; int main() { IplImage* img = cvLoadImage("a1.ppm"); //IplImage是opencv中处理图像的数据结构,支持所有图像格式。 //cvLoadImage函数读入图像"a1.ppm",返回一个指针变量。 cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE); //cvNamedWindow函数创建一个名为"Example1"的窗口,第二个参 //数CV_WINDOW_AUTOSIZE表示窗口大小自动调整与图像大小相同 cvShowImage("Example1",img); //cvShowImage将图像img在窗口Example中显示出来。 cvWaitKey(0); //cvWaitKey函数功能是等待双击事件,双击后退出。 cvReleaseImage(&img);//释放图像内存 cvDestroyWindow("Example1");//释放窗口内存 }
第二个程序-展示AVI视频
具体情形与图像差不多,但要设置一个循环来读取每一幅画面,同时能在视频结束或者你不想看时退出循环。 代码:
#include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; int main() { cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);//创建窗口 CvCapture* capture=cvCreateFileCapture("a2.mp4"); //cvCreateFileCapture函数作用是载入视频"a2.mp4"并返回指针到 //视频数据结构CvCapture创建的变量capture中,这时capture便包含视频 //中的所有信息。 IplImage* frame;//创建变量frame while(1){ frame=cvQueryFrame(capture);/*cvQueryFrame的参数为CvCapture结构的指针。用来将下一帧视频文件载入内存,返回一个对应当前帧的指针。与cvLoadImage不同的是cvLoadImage为图像分配内存空间,而cvQueryFrame使用已经在cvCapture结构中分配好的内存。*/ if(!frame) break;//frame为空时退出循环 cvShowImage("Example2",frame);//显示当前画面 char c=cvWaitKey(33);//等待33毫秒,如有按键,将值赋给c if(c==27) break;/*如果按键是“Esc”键(ASCLL 27),结束循环*/ } cvReleaseCapture(&capture); cvDestroyWindow("Example2"); }
简单的视频播放器
接下来介绍cvSetCaptureProperty等函数在视频播放中加入进度条,这样就可以取得调戏自己家的进度条成就了。代码及注释如下:
#include <stdio.h> #include <fstream> #include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; using namespace std; int g_slider_position = 0; CvCapture* g_capture = NULL; //定义onTrackbarSlide回调函数来输入滚动条的位置pos void onTrackbarSlide(int pos) { cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos); /*cvSetCaptureProperty函数用于设置capture结构的各种属性,CV_CAP_PROP_POS_FRAMES表示以帧数来设置读入位置。*/ } int main( ) { cvNamedWindow( "Example3", CV_WINDOW_AUTOSIZE ); g_capture = cvCreateFileCapture( "a2.mp4" ); IplImage *foo = cvQueryFrame( g_capture); //获取视频的帧数、画面的长和宽 int frames = (int) cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT ); int tmpw = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_WIDTH); int tmph = (int) cvGetCaptureProperty( g_capture, CV_CAP_PROP_FRAME_HEIGHT ); printf("opencv frames %d w %d h %d\n",frames,tmpw,tmph); cvCreateTrackbar( "Position", "Example3", &g_slider_position, frames, onTrackbarSlide );/* cvCreateTrackbar函数用于创建进度条,参数含义:Position-进度条名字;Example3-需要加入进度条的窗口名字 &g_slider_position整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置;frames-滑块位置的最大值。 onTrackbarSlide-回调函数的指针*/ IplImage* frame; frames = 0; while(1) { frame = cvQueryFrame( g_capture ); if( !frame ) break; int frames = cvGetCaptureProperty( g_capture, CV_CAP_PROP_POS_FRAMES);//返回当前进度条位置对应的帧数 frames++; cvSetTrackbarPos("Position","Example3",frames);//自动控制滚条位置 cvShowImage( "Example3", frame ); char c = (char)cvWaitKey(10); if( c == 27 ) break; } cvReleaseCapture( &g_capture ); cvDestroyWindow( "Example3" ); return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- DVI 视频接口图文解析
- Lua和C语言的交互详解
- C#实现语音视频录制-附demo源码
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法