通过OpenCV打开本地视频文件,本地USB UVC摄像头以及网络摄像头(通过RTSP协议)的Demo。
RTSP的uri格式【rtsp://[user:password@]ip_address/[path/]file】。
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
#pragma comment(lib, "opencv_core249d.lib")
#pragma comment(lib, "opencv_highgui249d.lib")
#pragma comment(lib, "opencv_imgproc249d.lib")
int main()
{
cout << "OpenCV version: " << CV_VERSION << endl;
//【1】读入视频
VideoCapture cap;
//【1a】从视频文件载入视频
//cap.open("VID_20151206_095030.mp4");
//【1b】从本地安装的摄像头载入视频
cap.open(0);
//【1c】从网络摄像头载入视频
//cap.open("rtsp://218.204.223.237:554/live/1/0547424F573B085C/gsfp90ef4k0a6iap.sdp"); //公开的RTSP测试服务器
//cap.open("rtsp://218.204.223.237:554/live/1/66251FC11353191F/e7ooqwcfbqjoo80j.sdp"); //公开的RTSP测试服务器 拱北口岸珠海过澳门大厅
//cap.open("rtsp://218.204.223.237:554/live/1/67A7572844E51A64/f68g2mj7wjua3la7.sdp"); //公开的RTSP测试服务器 横琴口岸入境大厅
//cap.open("rtsp://admin:@192.168.254.136:10554/tcp/av0_1"); //本地网络中的摄像头,我用来测试的摄像头,但是获取不到open的时候有问题;通过VLC能打开,证明uri没问题。
if (!cap.isOpened())
{
cout << "摄像头不能打开!" << endl;
cout << "按任意键退出程序!" << endl;
waitKey(0);
return -1;
}
namedWindow("实时视频");
Mat frame; //定义一个Mat变量,用于存储每一帧的图像
//【2】循环显示每一帧
while(waitKey(33) != 27) //延时33毫秒,若检测到ESC被按下,则退出循环
{
cap >> frame; //读取当前帧
if (frame.data == NULL)
{
cout << "丢失图像!" << endl;
CvFont font = fontQt("Times");
//addText(frame, "图像丢失", Point(10,10),font);
//imshow("实时视频", frame); //显示当前帧
}
else
{
imshow("实时视频", frame); //显示当前帧
}
}
cout << "按任意键退出程序!" << endl;
waitKey(0);
return 0;
}