索引地址:系列索引
基础篇的文章处理的对象都是读取的一张图片,那么高级篇的第一篇就是连续图片,即视频.
视频(Video)泛指将一系列静态影像以电信号的方式加以捕捉、纪录、处理、储存、传送与重现的各种技术。连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频。视频技术最早是为了电视系统而发展,但现在已经发展为各种不同的格式以利消费者将视频记录下来。网络技术的发达也促使视频的纪录片段以串流媒体的形式存在于因特网之上并可被电脑接收与播放。视频与电影属于不同的技术,后者是利用照相术将动态的影像捕捉为一系列的静态照片。
本地视频
VideoCaptur()函数原型:
1 2 3
| VideoCapture::VideoCapture() VideoCapture::VideoCapture(const string& filename) VideoCapture::VideoCapture(int device)
|
filename是视频名称(可以是相对路径也可以是绝对路径),device是设备(摄像头等)的编号.
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
#include <opencv2/opencv.hpp> using namespace cv;
int main() { VideoCapture capture("1.avi");
while (1) { Mat frame; capture >> frame;
if (frame.empty()) { break; }
imshow("Video", frame); waitKey(30); } return 0; }
|
从程序所在的文件夹中读取名称为1.avi的视频文件,然后显示在界面上,视频播放完毕后自动退出程序.
摄像头
摄像头功能是使用设备id,摄像头的默认id为0.
只需要将上面的代码修改一下就可以了.
1 2
| VideoCapture capture(0);
|
opencv视频部分使用的是FFmpeg。
效果如下:
获取视频属性信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <opencv2/opencv.hpp> #include <iostream>
using namespace std; using namespace cv;
int main() { VideoCapture capture; capture.open("beat.mp4"); if (!capture.isOpened()){ std::cout << "fail to open video!" << std::endl; return -1; } long nTotalFrame = capture.get(CV_CAP_PROP_FRAME_COUNT); std::cout << "nTotalFrame = " << nTotalFrame << std::endl; int frameHeight = capture.get(CV_CAP_PROP_FRAME_HEIGHT); int frameWidth = capture.get(CV_CAP_PROP_FRAME_WIDTH); std::cout << "frameHeight = " << frameHeight << std::endl; std::cout << "frameWidth = " << frameWidth << std::endl; double FrameRate = capture.get(CV_CAP_PROP_FPS); std::cout << "FrameRate = " << FrameRate << std::endl; cv::Mat frameImg; long nCount = 1; while (true){ std::cout << " Current frame: " << nCount << std::endl; capture >> frameImg; if (!frameImg.empty()){ imshow("frameImg", frameImg); } else{ break; } if (char(waitKey(1)) == 'q'){ break; } nCount++; } capture.release(); return 0; }
|
测试结果为:
1 2 3 4 5 6 7 8 9 10
| nTotalFrame = 7522 frameHeight = 480 frameWidth = 852 FrameRate = 25 Current frame: 1 Current frame: 2 Current frame: 3 Current frame: 4 Current frame: 5 ...
|