Opencv 播放mp4文件和读取摄像头图以及可能会发生的一些异常问题解决方法

2021年7月6日 11点热度 0条评论

学习内容

学习Opencv 读取并播放本地视频和打开摄像头图像以及可能会发生的一些异常问题解决方法

代码演示

电脑环境信息: OpenCV版本:4.5.2 ,vs2017

1.视频文件读取与播放
加载本地视频基本代码:

#include "opencv2/opencv.hpp"
#include <iostream>
#include <Windows.h>

using namespace std;
using namespace cv;

int main(int argc, char **argv)
{
	cv::VideoCapture vedio("D:/workspace/opencv/project/test.mp4");
	if (!vedio.isOpened())
	{
		cout << "读取视频文件失败!" << endl;
		return -1;
	}
	else 
	{
		cout << "读取视频文件成功!" << endl;
	}

	return 0;
}

运行结果

我们发现运行结果是读取失败,然后我们先检查一下文件是否存在,我们的路径是否写错....

经过一阵的捣鼓,发现视频文件确实存在而且没有错误,路径也是非常的正确!

那为什么不能加载呢?试着猜想会不会缺少相关的库造成呢,经探索,opencv播放是依赖ffmpeg的,所以我们去找相关的库放在同exe目录下试试。

1.找到安装的opencv目录处

2.复制到我们debug目录下跟exe同级

接下来我们再运行一次

哎,运行成功啦。

接下来,读取视频文件没有问题啦,就进行显示代码的编写

#include "opencv2/opencv.hpp"
#include <iostream>
#include <Windows.h>

using namespace std;
using namespace cv;

int main(int argc, char **argv)
{
	cv::VideoCapture vedio("D:/workspace/opencv/project/test.mp4");
	if (!vedio.isOpened())
	{
		cout << "读取视频文件失败!" << endl;
		return -1;
	}
	else 
	{
		cout << "读取视频文件成功!" << endl;
	}

	Mat frame;
	namedWindow("Vedio", WINDOW_NORMAL);

	/*视频文件的宽高和帧率信息*/
	cout << "Vedio Width:"  << vedio.get(CAP_PROP_FRAME_WIDTH) << endl;
	cout << "Vedio Height:" << vedio.get(CAP_PROP_FRAME_HEIGHT) << endl;
	cout << "Vedio FPS:"    << vedio.get(CAP_PROP_FPS) << endl;

	/*循环读取视频文件*/
	while (true)
	{
		vedio >> frame; /*获取一帧*/

		if (frame.empty())  /*读取完成则退出*/
			break;

		double sec = 1000.0 / vedio.get(CAP_PROP_FPS);/*播放速度*/

		if (waitKey(sec) == VK_ESCAPE) /*播放过程中可按ESC退出播放*/
			break;

		imshow("Vedio", frame);  /*显示帧*/
	}

	destroyAllWindows();/*清理资源*/

	return 0;
}

运行结果

播放视频文件编写完成!

2.读取摄像头图像

有了上面的基础,编写读取摄像头的方式就非常简单啦

#include "opencv2/opencv.hpp"
#include <iostream>
#include <Windows.h>

using namespace std;
using namespace cv;

int main(int argc, char **argv)
{
	cv::VideoCapture vedio;
	vedio.open(0); /*读取第一个摄像头*/

	if (!vedio.isOpened())
	{
		cout << "打开摄像头失败!" << endl;
		return -1;
	}
	else 
	{
		cout << "打开摄像头成功!" << endl;
	}

	Mat frame;
	namedWindow("Vedio", WINDOW_NORMAL);

	/*视频文件的宽高和帧率信息*/
	cout << "Vedio Width:"  << vedio.get(CAP_PROP_FRAME_WIDTH)  << endl;
	cout << "Vedio Height:" << vedio.get(CAP_PROP_FRAME_HEIGHT) << endl;

	/*循环读取视频文件*/
	while (true)
	{
		vedio >> frame; /*获取一帧*/

		if (frame.empty())  /*读取完成则退出*/
			break;

		int sec = 25;/*播放速度*/

		if (waitKey(sec) == VK_ESCAPE) /*播放过程中可按ESC退出播放*/
			break;

		imshow("Vedio", frame);  /*显示帧*/
	}

	destroyAllWindows();/*清理资源*/

	return 0;
}

运行结果

以上就是利用OpenCV读取摄像头的内容

四.结束

简单的东西也需要做简单的记录,在打开摄像头这里,只能按Index序号打开,但如果实际中存在有多个摄像头的时候呢?如何区分以及如何去指定打开其中一个摄像头?值得思考一下,敬请待续。