OpenCV用类VideoCapture实现视频读取的相关操作。
VideoCapture类的构造函数有三种原型,分别如下:
C++原型如下:
1
2
3
4cv::VideoCapture::VideoCapture() cv::VideoCapture::VideoCapture(const String & filename,int apiPreference = CAP_ANY) cv::VideoCapture::VideoCapture(int index,int apiPreference = CAP_ANY)
Pytyhon原型如下:
1
2
3
4<VideoCapture object> = cv.VideoCapture() <VideoCapture object> = cv.VideoCapture(filename[, apiPreference]) <VideoCapture object> = cv.VideoCapture(index[, apiPreference])
第一种原型是无参数的;
第二种原型用于打开视频文件;
第三种原型用于打开摄像头;
参数apiPreference用指定视频和摄像头打开视频时的相关API接口规范,
关于参数apiPreference各取值的详细意义大家可参考下面这篇博文:
https://www.hhai.cc/thread-132-1-1.html
读取视频文件的C++示例代码如下:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71//出处:昊虹AI笔记网(hhai.cc) //用心记录计算机视觉和AI技术 //OpenCV版本 OpenCV3.0 #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { // 定义相关VideoCapture对象 VideoCapture capture; // 读取视频文件 capture.open("F:/material/videos/tea.mp4"); // 判断视频流读取是否正确 if (!capture.isOpened()) { std::cout << "fail to open video!" << std::endl; return -1; } std::cout << "视频读取成功" << std::endl << std::endl; // 获取视频相关信息-帧像素宽高 int frameWidth = capture.get(CV_CAP_PROP_FRAME_WIDTH); int frameHeight = capture.get(CV_CAP_PROP_FRAME_HEIGHT); std::cout << "视频中图像的宽度为:" << frameWidth << std::endl; std::cout << "视频中图像的高度为: " << frameHeight << std::endl; // 获取视频相关信息-帧率 double FrameRate = capture.get(CV_CAP_PROP_FPS); std::cout << "视频帧率为:" << FrameRate << std::endl; // 获取视频相关信息-帧数 long nTotalFrame = capture.get(CV_CAP_PROP_FRAME_COUNT); std::cout << "视频总帧数为:" << nTotalFrame << 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); if (char (waitKey(int(1000 / FrameRate)) == 'q')) // 按下键盘上q键退出 break; } else { break; } nCount++; } // 视频释放 capture.release(); return 0; }
上面代码中用到的视频的下载链接:
https://pan.baidu.com/s/1SZk7osETBYcqH9IkGcrpAQ
提取码:uutz
运行结果如下图所示:
读取视频文件的Python示例代码如下:
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# -*- coding: utf-8 -*- # 出处:昊虹AI笔记网(hhai.cc) # 用心记录计算机视觉和AI技术 # OpenCV的版本为4.4.0 import cv2 as cv if __name__ == '__main__': video = cv.VideoCapture('F:/material/videos/tea.mp4') if video.isOpened(): print('视频读取成功n') # 输出相关信息 print('视频中图像的宽度为:{}'.format(video.get(cv.CAP_PROP_FRAME_WIDTH))) print('视频中图像的高度为:{}'.format(video.get(cv.CAP_PROP_FRAME_HEIGHT))) print('视频帧率为:{}'.format(video.get(cv.CAP_PROP_FPS))) print('视频总帧数为:{}'.format(video.get(cv.CAP_PROP_FRAME_COUNT))) else: print('视频读取失败n') # 如果视频读取成功则创建视频流 while video.isOpened(): ret, frame = video.read() if ret is True: cv.imshow('Tea', frame) # 设置视频播放速度 # 下面这行代码用于控制播放速度 key_value = cv.waitKey(int(1000 / video.get(cv.CAP_PROP_FPS))) if key_value & 0xFF == ord('q'): # 按下q键退出 break else: break # 释放并关闭窗口 video.release() cv.destroyAllWindows()
上面代码中用到的视频的下载链接:
https://pan.baidu.com/s/1SZk7osETBYcqH9IkGcrpAQ
提取码:uutz
运行结果截图如下:
代码很简单,没什么好多说的,如果对代码中的函数waitKey()不太明白,可参考下面这篇博文:
https://www.hhai.cc/thread-133-1-1.html
接下来使用类VideoCapture打开摄像头。
使用类VideoCapture打开摄像头时,用其构造函数的第三种原型,即下面这种原型:
C++原型:
1
2cv::VideoCapture::VideoCapture(int index,int apiPreference = CAP_ANY)
Python原型:
1
2<VideoCapture object> = cv.VideoCapture(index[, apiPreference])
参数index表示摄像头的索引号,如果填0则表示使用计算机的默认摄像头,参数apiPreference的详细介绍大家可参考下面这篇博文:
https://www.hhai.cc/thread-132-1-1.html
打开摄像头的C++示例代码如下:
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
52
53
54
55
56
57
58
59
60
61
62
63
64//出处:昊虹AI笔记网(hhai.cc) //用心记录计算机视觉和AI技术 //OpenCV版本 OpenCV3.0 #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { // 定义相关VideoCapture对象 VideoCapture capture(0); // 判断摄像头是否成功打开 if (!capture.isOpened()) { std::cout << "fail to open video!" << std::endl; return -1; } std::cout << "打开摄像头成功" << std::endl << std::endl; // 获取摄像头相关信息-帧像素宽高 int frameWidth = capture.get(CV_CAP_PROP_FRAME_WIDTH); int frameHeight = capture.get(CV_CAP_PROP_FRAME_HEIGHT); std::cout << "摄像头中图像的宽度为:" << frameWidth << std::endl; std::cout << "摄像头中图像的高度为: " << frameHeight << std::endl; // 获取摄像头相关信息-帧率 double FrameRate = capture.get(CV_CAP_PROP_FPS); std::cout << "摄像头帧率为:" << 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); if (char (waitKey(1) == 'q')) // 按下键盘上q键退出 break; } else { break; } nCount++; } // 释放capture对象 capture.release(); return 0; }
运行结果如下图所示:
打开摄像头的Python示例代码如下:
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# -*- coding: utf-8 -*- # 出处:昊虹AI笔记网(hhai.cc) # 用心记录计算机视觉和AI技术 # OpenCV的版本为4.4.0 import cv2 as cv if __name__ == '__main__': video = cv.VideoCapture(0) # 打开摄像头 if video.isOpened(): print('摄像头打开成功n') # 输出相关信息 print('摄像头中图像的宽度为:{}'.format(video.get(cv.CAP_PROP_FRAME_WIDTH))) print('摄像头中图像的高度为:{}'.format(video.get(cv.CAP_PROP_FRAME_HEIGHT))) print('摄像头帧率为:{}'.format(video.get(cv.CAP_PROP_FPS))) else: print('摄像头打开失败n') # 如果摄像头打开则创建视频流 while video.isOpened(): ret, frame = video.read() if ret is True: cv.imshow('frameImg', frame) # 按下q键退出 key_value = cv.waitKey(1) if key_value & 0xFF == ord('q'): break else: break # 释放并关闭窗口 video.release() cv.destroyAllWindows()
运行结果如下图所示:
代码很简单,就不多作说明了。
最后
以上就是清脆高山最近收集整理的关于OpenCV中使用类VideoCapture加载视频和打开摄像头的全部内容,更多相关OpenCV中使用类VideoCapture加载视频和打开摄像头内容请搜索靠谱客的其他文章。
发表评论 取消回复