使用opencv播放视频,只要通过循环顺序读取视频中的每一帧,并显示一定的时间即可。
一:主要函数介绍
一:主要函数介绍
1.1
函数功能:初始化从文件中获取视频
函数功能:初始化从文件中获取视频
函数原型:
CvCapture *cvCreateFileCapture(const char*filename);
CvCapture *cvCreateFileCapture(const char*filename);
1.2
函数功能:从摄像头或者文件中抓取并返回一帧
函数功能:从摄像头或者文件中抓取并返回一帧
函数原型:
IplImage *cvQueryFrame(CvCapture *capture);
IplImage *cvQueryFrame(CvCapture *capture);
函数说明:
函数将下一帧视频文件更新到capture中,返回一个对应当前帧的指针
函数将下一帧视频文件更新到capture中,返回一个对应当前帧的指针
1.3
函数功能:对图像进行平滑处理
函数功能:对图像进行平滑处理
函数原型:
void cvSmooth(const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0, double param4=0);
void cvSmooth(const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0, double param4=0);
函数说明:
src 输入图像,
dst 输出图像,
smoothtype 平滑方法,值如下
CV_BLUR_NO_SCALE(简单不带尺度变换的模糊) - 对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。CV_BLUR (simple blur)- 对每个象素param1×param2邻域 求和并做尺度变换 1/(param1?param2).CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积CV_MEDIAN (median blur)- 对图像进行核大小为param1×param1 的中值滤波 (i.e. 邻域是方的).CV_BILATERAL(双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2.
param1
平滑操作的第一个参数.
param2
平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果param2的值 为零,则表示其被设定为param1。
param3
对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算:
sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核,
n=param2 对应垂直核.
对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小有 sigma 计算 (以保证足够精确的操作).
#include
<iostream>
#include
<opencv2/opencv.hpp>
#include
<opencv2/highgui/highgui.hpp>
#include
<opencv2/core/core.hpp>
using
namespace
std;
using
namespace
cv;
int
gSliderPosition = 1;
CvCapture *gcvCapture = NULL;
//cvCreateTrackbar的回调函数
void
on_change(
int
pos)
{
cvSetCaptureProperty(gcvCapture,CV_CAP_PROP_POS_FRAMES,pos);
}
//创建滑动条,对视频进行控制
void
CreateTrackbar(
char
*pWindTitle,
int
frames)
{
cvCreateTrackbar(
"position"
,pWindTitle,&gSliderPosition,frames,on_change);
int
position = 1;
on_change(position);
}
int
main()
{
char
*pWindowTitle =
"video"
;
//读取视频文件
cvNamedWindow(pWindowTitle,CV_WINDOW_AUTOSIZE);
gcvCapture = cvCreateFileCapture(
"141.avi"
);
int
frames = (
int
)cvGetCaptureProperty(gcvCapture,CV_CAP_PROP_FRAME_COUNT);
//获取视频总帧数
if
(0 != frames)
{
//创建滑动条
CreateTrackbar(pWindowTitle,frames);
}
IplImage *pImage = NULL;
while
(1)
{
//获取文件的每一帧
pImage = cvQueryFrame(gcvCapture);
//对图像进行平滑处理
cvSmooth(pImage,pImage);
if
(!pImage)
break
;
cvShowImage(pWindowTitle,pImage);
char
c = cvWaitKey(2);
if
(c==27)
//按esc退出
break
;
}
cvReleaseCapture(&gcvCapture);
cvDestroyAllWindows();
return
0;
}
程序运行如下:
源代码下载
源代码中没有视频文件,下载后请拷贝一个视频到包含main.cpp的文件下,并改名为“001.avi”。
程序运行如下:
源代码下载
源代码中没有视频文件,下载后请拷贝一个视频到包含main.cpp的文件下,并改名为“001.avi”。