1 前言

前边2篇文章介绍了在WIN10系统上,分别用C++和Python调用OpenCV接口,加载和显示一张静态图片。本篇我们来看一下,用C++如何调用OpenCV接口,打开和播放本地视频文件,打开本地、网络摄像头并播放视频。

序号

视频来源

视频格式/协议

参数

1

本地视频文件

MP4

文件名称

2

笔记本摄像头


摄像头序号

3

网络摄像头

RTSP

rtsp://admin:123456@192.168.1.105:554/Streaming/Channels/101

下边我们用海康IP摄像机做测试,所以表格中的rtsp地址,是海康摄像机的URL格式,其它品牌(大华、宇视)与之类似。

rtsp://admin:123456@192.168.1.105:554/Streaming/Channels/101

rtsp:表示采用RTSP协议从摄像机取流

admin:摄像机网页登录用户名

123456:摄像机网页登录密码

192.168.1.105:摄像机IP地址

554:RTSP默认端口

2 OpenCV接口说明

在测试程序中,主要用到了OpenCV以下接口:

VideoCapture:视频捕捉类,从视频文件、图像序列或摄像机捕获视频。

我们主要使用到成员函数open,下边是open函数的原型:

/** @brief  Opens a video file or a capturing device or an IP video stream for video capturing.
    @overload
    Parameters are same as the constructor VideoCapture(const String& filename, int apiPreference = CAP_ANY)
    @return `true` if the file has been successfully opened
    The method first calls VideoCapture::release to close the already opened file or camera.
*/
CV_WRAP virtual bool open(const String& filename, int apiPreference = CAP_ANY);

播放视频文件和网络摄像机用到这个open重载函数。

/** @brief  Opens a camera for video capturing
    @overload
    Parameters are same as the constructor VideoCapture(int index, int apiPreference = CAP_ANY)
    @return `true` if the camera has been successfully opened.
    The method first calls VideoCapture::release to close the already opened file or camera.
*/
CV_WRAP virtual bool open(int index, int apiPreference = CAP_ANY);

播放笔记本摄像头视频,用到这个open重载函数。

3 创建测试项目

创建测试项目、配置开发环境,具体可参考上篇文章,这里就不多说了

Win10+OpenCV4.6.0之开发环境(VS2022)配置入门_chexlong的博客

这次测试项目名称play_video,VS2022种创建好的项目截图

海康网络摄像头 流 取帧 python opencv海康rtsp取流_ide

将下列代码编辑到play_video.cpp文件里

#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;

//打开视频文件或网络摄像头,并播放视频
bool OpenAndPlayVideoFile(const std::string& filename)
{
	cout << "将要播放视频文件,按下空格键结束播放" << endl;
	
	VideoCapture capture;
	bool result = capture.open(filename);

	//检查是否成功打开
	if (!capture.isOpened())
	{
		cout << "打开文件失败,名称:" << filename << endl;
		return result;
	}

	//打印视频参数:宽、高、每秒传输帧数
	cout << "width = " <<  capture.get(CAP_PROP_FRAME_WIDTH) << endl;
	cout << "height =" << capture.get(CAP_PROP_FRAME_HEIGHT) << endl;
	cout << "fps = " << capture.get(CAP_PROP_FPS) << endl;

	try
	{
		Mat frame;
		while (true)
		{
			capture >> frame;				//读取视频帧
			imshow("视频文件", frame);      //在名称为“视频文件”的窗口中显示视频
			if (32 == waitKey(1))			//按下空格键退出视频每帧的显示
			{
				cout << "按下空格键,退出播放" << endl;
				break;
			}
		}
	}
	catch (const std::exception& e)
	{
		cout << "exception:" << e.what() << endl;
	}

	capture.release();
	destroyWindow("视频文件");
	cout << "视频文件播放完成" << endl << endl;
	return result;
}

//打开本地摄像头,并播放视频
bool OpenAndPlayLocalCamera(const int& index)
{
	cout << "将要播放本地摄像头视频,按下空格键结束播放" << endl;

	VideoCapture capture;
	bool result = capture.open(index); //打开0号、或1号、或2号...摄像头

	//检查是否成功打开
	if (!capture.isOpened())
	{
		cout << "打开本地摄像头失败, 编号:" << index << endl;
		return result;
	}

	//打印视频参数:宽、高、每秒传输帧数
	cout << "width = " << capture.get(CAP_PROP_FRAME_WIDTH) << endl;
	cout << "height =" << capture.get(CAP_PROP_FRAME_HEIGHT) << endl;
	cout << "fps = " << capture.get(CAP_PROP_FPS) << endl;

	try
	{
		Mat frame;
		while (true)
		{
			capture >> frame;				//读取视频帧
			imshow("本地摄像头", frame);    //在名称为“本地摄像头”的窗口中显示视频
			if (32 == waitKey(1))			//按下空格键退出视频每帧的显示
			{
				cout << "按下空格键,退出播放" << endl;
				break;
			}
		}
	}
	catch (const std::exception& e)
	{
		cout << "exception:" << e.what() << endl;
	}

	capture.release();
	destroyWindow("本地摄像头");
	cout << "视频文件播放完成" << endl << endl;
	return result;
}

int main()
{
	cout << "使用OpenCV播放视频测试" << endl;

	//打开本地文件播放
	OpenAndPlayVideoFile("opencv.mp4");

	//打开本地0号摄像头播放
	OpenAndPlayLocalCamera(0); 

	//打开网络摄像头播放
	OpenAndPlayVideoFile("rtsp://admin:123456@192.168.1.105:554/Streaming/Channels/101");

	cout << "完成测试" << endl;
	system("pause");
	return 0;
}

程序中实现了下边2个播放函数

//打开视频文件或网络摄像头,并播放视频
bool OpenAndPlayVideoFile(const std::string& filename)

//打开本地摄像头,并播放视频
bool OpenAndPlayLocalCamera(const int& index)

代码中的视频文件opencv.mp4,放置在测试项目工程当前目录,如截图

海康网络摄像头 流 取帧 python opencv海康rtsp取流_计算机视觉_02

VS中代码截图

海康网络摄像头 流 取帧 python opencv海康rtsp取流_海康网络摄像头 流 取帧 python_03

4 播放效果截图

视频文件

海康网络摄像头 流 取帧 python opencv海康rtsp取流_计算机视觉_04

网络摄像头

海康网络摄像头 流 取帧 python opencv海康rtsp取流_c++_05

调试控制台输出

海康网络摄像头 流 取帧 python opencv海康rtsp取流_ide_06