OpenCV 笔记(03)— 读取视频、通过摄像头采集视频、采集视频 canny 边缘检测

我们本节学习如何利用 OpenCV 中的 VideoCapture 类,来对视频进行读取显示,以及调用摄像头。

VideoCapture 它提供了从摄像机或视频文件捕获视频的 C++ 接口, 作用是从视频文件或从摄像头捕获视频并显示出来。

1. 读取并播放视频

VideoCapture 读入视频方法有两种:

  • 先实例化再初始化:
VideoCapture capture;
capture.open("demo.mp4");
  • 在实例化的同时进行初始化:
VideoCapture capture("demo.mp4");

这两种写法的区别就如我们定义一个 int 类型的变量一样:

int a;
a = 1;

为先定义再初始化,而

int a = 1;

为在定义时初始化。

完整代码:

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

using namespace cv;	

int main()
{
	VideoCapture capture("demo.mp4");	// 读入视频
	if(!capture.isOpened())	// 判断文件是否正确打开
	{
		std::cout << "video not exist";
		return -1;
	}

	while(1) // 循环显示每一帧
	{
		Mat frame;	// 定义一个Mat 变量, 用于存储每一帧的图像
		capture >> frame;	// 读取当前帧到 Mat 变量中 
		imshow("读取视频", frame);	// 显示当前帧 
		waitKey(30);	// 延时 30 ms
	}
	capture.release();	//释放资源
	return 0;
}

2. 通过摄像头采集视频

要调用摄像头进行视频采集的话,将代码

VideoCapture capture("demo.mp4")

替换为

VideoCapture capture(0)

表示从摄像头而不是从文件中读取视频。其它代码和通过读取视频文件播放视频代码一致,完整代码如下:

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

using namespace cv;	

int main()
{
	VideoCapture capture(0);	// 读入视频
	if(!capture.isOpened())	// 判断文件是否正确打开
	{
		std::cout << "video not exist";
		return -1;
	}

	while(1) // 循环显示每一帧
	{
		Mat frame;	// 定义一个Mat 变量, 用于存储每一帧的图像
		capture >> frame;	// 读取当前帧到 Mat 变量中 
		imshow("读取视频", frame);	// 显示当前帧 
		waitKey(30);	// 延时 30 ms
	}
	capture.release();	//释放资源
	return 0;
}

3. 采集视频并做 canny 检测

我们还可以用上面的摄像头调用示例程序来配合 canny 边缘检测, 得到 canny 边缘检测并高斯模糊后的摄像头采集视频,源码如下:

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

using namespace cv;	

int main()
{
	VideoCapture capture(0);	// 从摄像头读入视频
	if(!capture.isOpened())	// 判断文件是否正确打开
	{
		std::cout << "video not exist";
		return -1;
	}

	Mat edges;
	while(1) // 循环显示每一帧
	{
		Mat frame;	// 定义一个Mat 变量, 用于存储每一帧的图像
		capture >> frame;	// 读取当前帧到 Mat 变量中 
		cvtColor(frame, edges, COLOR_BGR2GRAY); // 转换 BGR 图为灰度图
		// 使用 3x3 内核降噪 2x3+1=7
		blur(edges, edges, Size(7, 7)); // 进行模糊
		// 进行 canny 边缘检测并显示
		Canny(edges, edges, 0, 30, 3);
		imshow("边缘检测并模糊后的视频", edges);	// 显示当前帧 
		waitKey(30);	// 延时 30 ms
	}
	capture.release();	//释放资源
	return 0;
}

OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,主要用于实时图像处理、计算机视觉任务和机器学习应用。在C++中使用OpenCV需要注意以下几个关键点: 1. **安装**:首先需要从官网下载适合你的平台的版本,并按照文档安装。确保路径添加到系统环境变量中,以便程序能够找到库文件。 2. **基本结构**:OpenCV的主要数据结构包括Mat(矩阵),它是最基本的数据容器,用于存储图像和像素数据。还有其他如Point、Size、Rect等用于表示几何形状的对象。 3. **函数使用**:OpenCV提供大量图像处理和计算机视觉函数,例如读取和显示图片(imread、imshow)、图像操作(resize、crop)、颜色空间转换、边缘检测Canny)、特征提取(SIFT、SURF)以及机器学习模块(比如Haar cascades用于人脸检测)。 4. **模板编程**:利用OpenCV提供的API,通常通过模板类和函数来编写代码,因为很多操作都是针对不同类型的图像矩阵。 5. **异常处理**:由于OpenCV函数可能会抛出错误,记得在关键部分使用try-catch块来捕获并处理异常。 6. **内存管理**:Mat对象在内部管理其内存,但建议手动释放不再使用的大型矩阵,避免内存泄漏。 7. **多线程支持**:OpenCV提供了线程安全的函数,如果你需要在多线程环境中工作,确保正确同步访问共享资源。 8. **实践项目**:熟悉OpenCV最好的方式就是实际参与一些项目,比如图像分类、物体追踪等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wohu007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值