昊虹AI笔记网

 找回密码
 立即注册
搜索
查看: 965|回复: 0
收起左侧

OpenCV中使用类VideoCapture加载视频和打开摄像头

[复制链接]

238

主题

241

帖子

931

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
931
昊虹君 发表于 2022-11-14 15:57 | 显示全部楼层 |阅读模式
OpenCV中使用类VideoCapture加载视频和打开摄像头

OpenCV用类VideoCapture实现视频读取的相关操作。

VideoCapture类的构造函数有三种原型,分别如下:
C++原型如下:
  1. cv::VideoCapture::VideoCapture()
  2. cv::VideoCapture::VideoCapture(const String & filename,int apiPreference = CAP_ANY)
  3. cv::VideoCapture::VideoCapture(int index,int apiPreference = CAP_ANY)
复制代码

Pytyhon原型如下:
  1. <VideoCapture object> = cv.VideoCapture()
  2. <VideoCapture object> = cv.VideoCapture(filename[, apiPreference])
  3. <VideoCapture object> = cv.VideoCapture(index[, apiPreference])
复制代码

第一种原型是无参数的;
第二种原型用于打开视频文件;
第三种原型用于打开摄像头;

参数apiPreference用指定视频和摄像头打开视频时的相关API接口规范,
关于参数apiPreference各取值的详细意义大家可参考下面这篇博文:
https://www.hhai.cc/thread-132-1-1.html

读取视频文件的C++示例代码如下:
[C++] 纯文本查看 复制代码
//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//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

运行结果如下图所示:

代码很简单,没什么好多说的,如果对代码中的函数waitKey()不太明白,可参考下面这篇博文:
https://www.hhai.cc/thread-133-1-1.html

读取视频文件的Python示例代码如下:
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术

# 博主微信/QQ 2487872782
# QQ群 271891601
# 欢迎技术交流与咨询

# 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. cv::VideoCapture::VideoCapture(int index,int apiPreference = CAP_ANY)
复制代码

Python:
  1. <VideoCapture object> = cv.VideoCapture(index[, apiPreference])
复制代码

参数index表示摄像头的索引号,如果填0则表示使用计算机的默认摄像头,参数apiPreference的详细介绍大家可参考下面这篇博文:
https://www.hhai.cc/thread-132-1-1.html

打开摄像头的C++示例代码如下:
[C++] 纯文本查看 复制代码
//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//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示例代码如下:
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术

# 博主微信/QQ 2487872782
# QQ群 271891601
# 欢迎技术交流与咨询

# 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()

运行结果如下图所示:

代码很简单,就不多作说明了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|昊虹AI笔记网 ( 蜀ICP备2024076726 )

GMT+8, 2024-5-19 16:24 , Processed in 0.026243 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表