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种创建好的项目截图
将下列代码编辑到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,放置在测试项目工程当前目录,如截图
VS中代码截图
4 播放效果截图
视频文件
网络摄像头
调试控制台输出