读入并显示视频文件,创建两个滑动条:
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;
else
t = 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文件永远指向同一块内存,即该内存的内容是不断被覆盖掉的