《学习opencv》第四章第四题

来源:互联网 发布:网络装修平台哪家最好 编辑:程序博客网 时间:2024/05/24 22:43

读入并显示视频文件,创建两个滑动条:

1 控制视频播放位置,以10为步长跳进

2 控制视频的停止、播放

代码:

// chapter4_4.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<cv.h>#include<highgui.h>int g_slider_Position = 0;//两个滑动条的初始位置int g_slider_Position1 = 0;CvCapture *g_capture = NULL;int i = 0;bool t = true;void TrackbarSlider(int pos){i = pos;}void switch_callback(int pos){if (!pos)t = true;elset = false;}int _tmain(int argc, _TCHAR* argv[]){cvNamedWindow("video", CV_WINDOW_AUTOSIZE);g_capture = cvCaptureFromFile("D:/768x576.avi");//读取视频, 返回视频结构指针int frames = (int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);//从视频结构读取视频帧数if (frames != 0){//创建两个滑动条cvCreateTrackbar("Position", "video", &g_slider_Position, frames, TrackbarSlider);cvCreateTrackbar("Position1", "video", &g_slider_Position1, 1, switch_callback);}else{printf("read video wrong!");}IplImage* frame;while ((frame = cvQueryFrame(g_capture)) != NULL)//从视频文件中读取一帧,解压返回{char c = cvWaitKey(10); if (c == 27)break;cvShowImage("video", frame);cvSetTrackbarPos("Position", "video", i);if (t){i += 10;cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, i);}else{cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, i);}}cvReleaseCapture(&g_capture);cvDestroyWindow("video");return 0;}

思路:定义两个全局变量i,t记录视频文件的当前帧数,并更新滑动条位置。暂停播放,即始终将视频设置在该帧。

函数解析:

(double) cvGetCaptureProperty( CvCapture* capture, int property_id )
获取视频的属性:
capture   视频结构指针
property_id   属性标识
属性有

#define CV_CAP_PROP_POS_MSEC       0     //以毫秒计算的当前的位置#define CV_CAP_PROP_POS_FRAMES     1  //以帧计算当前的位置#define CV_CAP_PROP_POS_AVI_RATIO  2  //视频的相对位置,从0 到 1 前面这三个参数应该是跟视频播放,读取相关的动态信息#define CV_CAP_PROP_FRAME_WIDTH    3    //帧宽#define CV_CAP_PROP_FRAME_HEIGHT   4   //帧高度#define CV_CAP_PROP_FPS            5    //帧率#define CV_CAP_PROP_FOURCC         6   //4 字符编码方式#define CV_CAP_PROP_FRAME_COUNT    7 //视频帧数#define CV_CAP_PROP_FORMAT         8   //视频格式#define CV_CAP_PROP_MODE           9  //#define CV_CAP_PROP_BRIGHTNESS    10   //亮度#define CV_CAP_PROP_CONTRAST      11  //对比度#define CV_CAP_PROP_SATURATION    12 //饱和度#define CV_CAP_PROP_HUE           13  //色调#define CV_CAP_PROP_GAIN          14 //增益#define CV_CAP_PROP_EXPOSURE      15 //曝光#define CV_CAP_PROP_CONVERT_RGB   16 //#define CV_CAP_PROP_WHITE_BALANCE 17 //白平衡#define CV_CAP_PROP_RECTIFICATION 18 //
此处我们用的是CV_CAP_PROP_FRAME_COUNT,即获取视频帧数

(int) cvCreateTrackbar( const char* trackbar_name, const char* window_name,int* value, int count, CvTrackbarCallback on_change CV_DEFAULT(NULL));

创建滑动条:
value:记录滑动条位置的值,当滑动条的位置改变时,该值相应发生变化。
count: 滑动条位置的最大值
CvTrackbarCallback:回调函数,每当滑动条位置变化时调用该函数,本例中用于更新i值。默认为NULL。

(void) cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos );
设置滑动条位置:
trackbar_name:滑动条名字
window_name:窗口名字
pos:位置的值


(int) cvSetCaptureProperty( CvCapture* capture, int property_id, double value )
设置视频文件属性:
本例中作用为,将视频文件定位到指定帧数。
由此可见,滑动条并不会自动根据帧数的增长而增长,而是通过程序同步的,因此需要配合cvSetTrackbarPos()一起使用达到同步效果
capture:视频结构指针
property_id:属性id:
CV_CAP_PROP_POS_MSEC - 从文件开始的位置,单位为毫秒
CV_CAP_PROP_POS_FRAMES - 单位为帧数的位置(只对视频文件有效)
CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FRAME_WIDTH - 视频流的帧宽度(只对摄像头有效)
CV_CAP_PROP_FRAME_HEIGHT - 视频流的帧高度(只对摄像头有效)
CV_CAP_PROP_FPS - 帧率(只对摄像头有效)
CV_CAP_PROP_FOURCC - 表示codec的四个字符(只对摄像头有效)
value:属性的值,本例中指的是视频文件的帧数


(IplImage*) cvQueryFrame( CvCapture* capture )

从视频文件结构中获取一帧,解压并返回,capture指向文件的下一帧。而返回的IplImage文件永远指向同一块内存,即该内存的内容是不断被覆盖掉的


原创粉丝点击