《学习opencv》第四章第四题

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

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文件永远指向同一块内存,即该内存的内容是不断被覆盖掉的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值