学习OpenCV(1)

xiaoxiao2021-02-28  128

前面一段时间看了一下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; }
转载请注明原文地址: https://www.6miu.com/read-55674.html

最新回复(0)