OpenCV(2):视频

时间:2021-09-14 15:26:39

播放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("D:\\OpenCVT\\1.mp4");
IplImage * frame;
while (1) {
frame = cvQueryFrame(capture);
cvShowImage("Example2", frame);
char c = cvWaitKey(33);
if (c == 27)
break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("Example2");
}

cvCreateFileCapture()

设置要读入的AVI文件,返回一个指向CvCapture结构的指针。这个结构包括了所有要读入AVI文件的信息。

在调用这个函数后,返回指针所指向的CvCpature结构被初始化到所对应的AVI文件的开头

frame=cvQueryFrame(capture);

一旦进入while(1)循环边开始读取AVI文件,cvQueryFrame的参数为CvCapture结构的指针。用来将下一帧

视频文件载入内存(填充或更新的CvCapture结构)。返回一个当前帧的视频。与cvLoadImage不同的是,

cvLoadImage为图像分配内存空间,而cvQueryFrame使用已经在cvCapture结构中分配好的内存。

c=cvWaitKey(33)

if(c==27) break;

当前帧被显示后,会等待33ms.如果其间用户触发了一个按键,c会被设置成这个按键的ASCLL码,否则c会

被设置成-1.如果用户触发了ESC键(ASCLL27)循环会被退出,读入视频停止,否则33ms后继续循环。

cvReleaseCapture(&capture);

退出循环体(视频文件已经读入结束或者用户触发了Esc键)后,我们应该释放为CvCapture结构开辟的内存

空间,这同时也会关闭所有打开的AVI文件相关的文件句柄。

视频播放控制

加一个滚动条来拖动视频,通过cvCreateTrackbar()来创建一个滚动条,并且通过设置参数确定滚动条所属于的窗口。

#include<iostream>
#include<opencv2/core/core.hpp>
#include<cv.h>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
int g_slider_position = 0;
CvCapture* g_capture = NULL;
void onTrackbarSlide(int pos) {
cvSetCaptureProperty(
g_capture,
CV_CAP_PROP_POS_FRAMES,
pos);
}
int main() {
cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);
g_capture = cvCreateFileCapture("D:\\OpenCVT\\1.avi");
int frames = (int)cvGetCaptureProperty(
g_capture,
CV_CAP_PROP_FRAME_COUNT
);
if (frames != 0) {
cvCreateTrackbar(
"Position",
"Example3",
&g_slider_position,
frames,
onTrackbarSlide
);
}
IplImage* frame;
while (1) {
frame = cvQueryFrame(g_capture);
if (!frame)break;
cvShowImage("Example3", frame);
char c = cvWaitKey(33);
if (c == 27)
break;
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("Example3");
return 0;
}

  

这种方法本质上是通过添加一个全局变量来表示滚动条位置并且添加一个回调函数更新变量以及重新设置视频读入位置。

我们通过一个调用来创建滚动条和确定回调函数。