前面一段时间看了一下OpenCV3编程入门,学习了一些基础知识。今天开始看学习OpenCV这本书,做了一个播放视频的小界面,记录一下。
在OpenCv3中播放视频要使用一个类:VideoCapture,比如:
VideoCapture capture("1.avi")。如果要使用摄像头则是VideoCapture(0)。
然后定义一个Mat对象:Mat frame。
使用capture >> frame,得到一帧图像。
那么正常的播放就是:
while(1)
{
capture >> frame;
imshow("1.avi",frame);
}
这功能还是过于简单,所以增加了按键功能,按下q键就退出,按下空格就暂停。
接下来增加滑动条,通过滑动条可以控制视频的播放。
首先,要得到视频的长度,即总的帧数。使用 VideoCapture::get(),原型为: CV_WRAP virtual double get(int propId) const;
propId参数填一个枚举,这里应该填入:CV_CAP_PROP_FRAME_COUNT。
接下来通过滑动滑动条可以跳跃播放,就要设置视频的当前帧,这里就要使用VideoCapture::set()。函数原型为:CV_WRAP virtual bool set(int propId, double value);propId应该使用CV_CAP_PROP_POS_FRAMES。这样,就可以通过滑动条控制视频了。
全部代码:
#include "stdafx.h"
#include "core.hpp"
#include "cv.h"
#include "cv.hpp"
#include "highgui.h"
#include "highgui.hpp"
#include "opencv.hpp"
#include <opencv2\opencv.hpp>
int nNowFrame =
0;
cv::VideoCapture capture;
cv::Mat frame;
void VideoTrackbar(
int pos)
{
capture.
set(CV_CAP_PROP_POS_FRAMES, pos);
cvSetTrackbarPos(
"video",
"1.avi", pos);
capture >> frame;
if (!frame.empty())
imshow(
"1.avi", frame);
}
int _tmain(
int argc, _TCHAR* argv[])
{
cv::namedWindow(
"1.avi");
capture.open(
"1.avi");
int count;
count = capture.
get(CV_CAP_PROP_FRAME_COUNT);
bool bStop =
false;
cvCreateTrackbar(
"video",
"1.avi", &nNowFrame, count, VideoTrackbar);
while (
1)
{
if(!bStop)
{
capture >> frame;
nNowFrame = capture.
get(CV_CAP_PROP_POS_FRAMES);
cvSetTrackbarPos(
"video",
"1.avi", nNowFrame);
if (frame.empty())
{
int nowPos = capture.
get(CV_CAP_PROP_FRAME_COUNT);
if (nowPos >= count)
{
capture.
set(CV_CAP_PROP_POS_FRAMES,
0);
cvSetTrackbarPos(
"video",
"1.avi",
0);
bStop =
true;
}
else
continue;
}
else
cv::imshow(
"1.avi", frame);
}
char key = (
char)cv::waitKey(
1);
switch (key)
{
case 'q':
return 0;
break;
case ' ':
bStop = !bStop;
break;
default:
break;
}
}
return 0;
}