深入理解OpenCV:实用计算机视觉项目解析(原书第3版)
上QQ阅读APP看书,第一时间看更新

1.1 访问摄像头

你可以简单调用cv::VideoCapture对象的open()方法(它是OpenCV中访问相机设备的方法)来访问计算机的摄像头或相机设备。将默认的相机编号0传递给此函数。如果某些计算机连接了多个相机或者将0作为默认相机编号使程序不能运行,那么,将用户指定相机编号作为命令行参数通常能解决这类问题,比如:若想指定相机编号为1、2或-1,这种方法就比较恰当。为了使程序在高分辨率相机上运行得更快,可用cv::VideoCapture::set()将相机的分辨率设置为640×480。

注意:由于相机的模式、驱动或操作系统不同,OpenCV可能无法改变某些相机的属性。这对本项目不重要,因此,此函数在你的摄像头上无法工作也别担心。

你可以将下面的代码放到main.cpp文件的main()函数中:

在摄像头被初始化后,可以将获取的当前相机图像作为cv::Mat对象(OpenCV的图像容器)。你可以使用cv::VideoCapture的C++流操作符来捕获相机的每一帧图像,放入cv::Mat对象中,这就像使用C++流操作符从控制台获取输入一样。

注意:OpenCV让从视频文件(如AVI、MP4文件)或网络流(取代网络摄像头)中捕获帧变得轻而易举。不是传递一个整数,如camera.open(0)就像它是一个摄像头一样,而是传递一个字符串,如camera.open(“my_video.avi”),即可捕获帧。本书提供了initCamera()函数的源代码,它可以打开摄像头、视频文件或网络流。