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

lvvou 2021-07-06 原文


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


学习内容

学习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序号打开,但如果实际中存在有多个摄像头的时候呢?如何区分以及如何去指定打开其中一个摄像头?值得思考一下,敬请待续。

posted on
2021-07-05 22:48 
拾荒荒 
阅读(45
评论(0
编辑 
收藏 
举报

 

版权声明:本文为lvvou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lvvou/p/14974760.html

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

随机推荐

  1. RS232、RS485、RS422、UART、SCI、SPI、IIC、USB、TCPIP、CAN、LIN

    串行通信和并行通信详解:https://wenku.baidu.com/view/89cdd0c5c0c708 […]...

  2. 如何使用socket进行java网络编程(六) – 肥兔子爱豆畜子

    如何使用socket进行java网络编程(六)      时间过得很快,一转眼已是3年后。个人的修炼不能停,接 […]...

  3. 每个优秀程序员都应遵循的代码原则和规范

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务, […]...

  4. zabbix4.0的安装与配置

    安装zabbix监控首先的先安装LNMP环境,在这里我采用事先准备好的脚本进行安装LNMP环境 脚本内容如下: […]...

  5. Windows server 2003 粘滞键后门+提权 – 海龙。

    Windows server 2003 粘滞键后门+提权 Windows server 2003中可以建立粘滞 […]...

  6. Excel打印视图模式,界面网格模式等设置

    Excel打印视图模式,界面网格模式等设置 在界面上只显示表格内容,而其他部分全是空白显示,也不显示有灰色的表 […]...

  7. 项目经理该干什么?

    项目经理 80% 的时间用来沟通,这才是你的工作啊。  我之前也写过代码,后来做做项目经理也是不怎么碰代码了, […]...

  8. 5.并发编程协程

    一 引子   本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发 […]...

展开目录

目录导航