RoboMaster机甲大师——视觉组——摄像头的选型与应用

FOR THE SIGMA
FOR THE GTINDER
FOR THE ROBOMASTER

简介:
本篇文章主要介绍在进行图像处理时,摄像头的选型与在不同平台上的运用,同时拓展了一些小知识。由于博主并非专业人士(目前暂时没有从事相关专业的决定),可能在叙述时会有一些相关专业知识错误的发生,希望读者可以反馈,博主会接收建议并修改错误,谢谢。

操作系统版本:
Ubuntu16.04 桌面版ubuntu16.04 下载
Windows10

所需器件:
任意一款USB摄像头(这里这要介绍CMOS)

参考文献:
卷帘快门与全局快门的区别
卷帘曝光和全局曝光的差别
线阵相机与面阵相机的区别及其应用
OpenCv设置摄像头参数/获得摄像头参数值
视觉工程师必须知道的工业相机50问,绝对干货!

更新:
2019.10.27 补充摄像头参数设置问题
2019.11.19 添加了一份视角与角度的关系图,方便各位选型
2019.11.23 增加一些名词解释,方便各位选型
2019.12.13 添加一个关于工业相机选型的一篇博客(很有价值,在参考文献中),同时分享一下跟深大视觉负责人一个下午设备选型的感想(后期可能会单独开一篇博客总结跟各个战队视觉组的交流感想)
2020.9.8 添加这个赛季摄像头的使用情况与一些其他参赛队伍推荐的工业相机(别人用过推荐的)
2020.9.18 添加前言

内容:
前言:
工业相机对于战队而言要是有钱的话(经费够)还是有必要来买一个试试的,无论是从技术迭代还是为了后续的传承等都是必定要走的道路,所以不用担心害怕驾驭得住不这个问题,了解后买就完事,工业相机也不需要关注什么品牌啥的,就关注以下几点:帧率、曝光方式、焦距、技术支持。特别是技术支持是很关键的,很多新战队面对工业相机一知半解,有些文档啥的要是没有就很伤脑筋,所以尽量确保有良好的技术支持是很关键的。

一、相机的分类
按照使用背景来划分:



在RoboMaster比赛中,识别的速度尽量越快越好,即摄像头帧率尽量越高越好。而通常这些摄像头的帧率一方面受摄像头自身硬件属性影响例如做工、型号、快门类型等等,一方面受计算平台处理能力因素(需要注意的是你的编译运行方式也可以影响,例如VSxxxx DEBUG模式与RELEASE模式),另一方面则受分辨率的增加而减少(带宽限制)
一般来说,在同分辨率情况下,黑白摄像头>>彩色摄像头
在识别当真黑白摄像头只需要加滤光片再进行处理就行了,而彩色摄像头则需要利用HSV处理或是加减对应颜色通道值即可。

摄像头的基本结构
镜头:目前顶级摄像头的镜头采用的是五层‘’全玻‘’,镜头的组成即为透镜的结构,由几片透镜组成,一般分为塑胶透镜(P)与玻璃透镜(G)。透镜越多,成本也高;玻璃透镜比塑胶透镜贵,因此采用玻璃透镜的摄像头其成像效果相对于塑胶镜头会好一些,例如结构为1G2P三层透镜的镜头。

焦距来划分

通过选择镜头利用提高图像的成像质量,从而清楚地进行图像识别,

在这里插入图片描述

果冻效应:在照片和视频拍摄里都会出现,而且机械快门和电子快门都有,胶片相机也躲不掉,最明显的是物体扭曲,对应检测一个高速运动的物体来说,是毁灭性的灾难。其本质为CMOS读取速度过慢。大多数相机的最高同步速度都不超1/250秒,它的原本含义是机械快门幕帘跨越成像元件所需的时间,速度快于这个时间的快门实际上都不是全开的,可以参考下图进行理解:
在这里插入图片描述

上面一排是低速快门,也就是低于最快同步速度时,比如曝光1秒,可以看到快门是可以全开,感光元件最上和最下列会有同时曝光的情况,在这种情况下使用闪光灯,可以保证整个感光元件都能对受闪光灯照射的被摄物正确曝光。
下面一排是高速快门,比如1/8000秒,虽然快门需要1/250秒才能完全跨过感光元件,但只要将前后帘移动的时间差等同于你想要拍摄的快门时间,就能保证前后帘之间留出的缝隙扫过的感光元件区域都是你想要的曝光时间,所以同步速度的快慢对于快门速度没有影响。
CMOS最上面一排像素的曝光早于最下面一排接近1/250秒,对于高速运转的物体来说,1/250秒已经可以运动很长一段距离了,所以这就是果冻效应的一个根本原因,参考飞机果冻效应。而对闪光灯来说,因为没有快门全开,超过最快同步速度时均匀曝光成为几乎不可能的事情,虽然也有采用多次闪光脉冲的方式实现高速同步,但闪光功率会明显降低,限制比较多。

当然若是资金允许的话也可以选用工业相机来替代一般的USB摄像头。
国内有名的就是大华、海康之类的,国外则是基恩士等。
而工业相机的选型上则可以分为以下两种:

由于受资金影响,本人亦没有太多工业相机的经验,可以参考下面-牧野-大佬的博客:
https://blog.csdn.net/dcrmg/article/details/52851913
工业相机基本参数以及选型参考(二)

名词解释:
帧率:一秒钟刷新图像的次数。曝光时间大于一帧的时间时,摄像头的帧率将会降低。所以若要摄像头帧率到达到标称值,必须手动调低曝光时间或是软件限制曝光值,若图像亮度过低,这需要调高曝光值或是增加补光灯,以便被拍摄物体增加亮度。

曝光:即图片芯片暴露在光线里时间的多少,曝光时间越长,图像芯片所得到的光电信号就会越强,图像质量就会越好。但是曝光时间大于一帧的时候,将会使摄像头帧率变低。

增益:即图像芯片所到的光电信号的放大倍数,增益值越大,图像光电信号放大得越强,图像也就越亮。但同时,放大倍数越大,噪声也会跟着一起放大,所以噪声点会增加很多,一般会通过算法或者硬件上将增益调低。

二、相机在不同系统上的驱动

在Windows10下
win10需要安装对应厂商提供的驱动,但是大多数厂商都是免驱的,需要驱动只需要联系对应厂商并下载相应驱动到桌面上是自动安装。

在Ubuntu16.04下
Linux下的摄像头驱动是V4L2,而调试摄像头参数的工具一般用qv4l2,它可以在程序运行时调节摄像头曝光
、帧速限制、尺寸、Gamma等。

qv4l2的安装(终端输入)

sudo apt install qv4l2 

或是

sudo apt install v4l-utils

调用软件

v4l2-ctl

三、相机调用

使用RMVideoCapture类调用摄像头
这是DJI开源视觉代码的摄像头驱动RMVideoCapture,跟VideoCapture作用一样,可以对摄像头的各种设置包括曝光、分辨率、帧率、图像格式等进行调整与设置,但据说DJI从2018年起就停止对其函数的维护,具体情况我也不是很清楚,但是这函数确实可以实现VideoCapture的功能

使用OpenCV的VideoCapture来调用摄像头
ubuntu在安装Opencv3时可能不会编译V4L2,所以我们需要对其进行手动编译(cmake GUI),在编译OpenCV3的时候选中WITH_V4L与WITH_LIBV4L
https://blog.csdn.net/guyii54/article/details/81041038

通过VideoCapture可以调用相关的参数,下面提供一个程序供大家了解如何调整摄像头常用的一些参数
(PS:这东西不分系统的win10与ubuntu皆通用,同时需要注意的是有些摄像头的参数并不能调值)

#include<opencv2/opencv.hpp>
using namespace cv;   
int main()
{
        char c = 0;
VideoCapture capture(0); //这里可以改为1,即外接摄像头,0为本地摄像头
//设置摄像头参数 不要随意修改
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080);//宽度 
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 960);//高度
capture.set(CV_CAP_PROP_FPS, 30);//帧数
capture.set(CV_CAP_PROP_BRIGHTNESS, 1);//亮度 1
capture.set(CV_CAP_PROP_CONTRAST,40);//对比度 40
capture.set(CV_CAP_PROP_SATURATION, 50);//饱和度 50
capture.set(CV_CAP_PROP_HUE, 50);//色调 50
capture.set(CV_CAP_PROP_EXPOSURE, 50);//曝光 50

//打印摄像头参数
printf("width = %.2f\n",capture.get(CV_CAP_PROP_FRAME_WIDTH)); //宽度 
printf("height = %.2f\n",capture.get(CV_CAP_PROP_FRAME_HEIGHT)); //高度
printf("fbs = %.2f\n",capture.get(CV_CAP_PROP_FPS)); //帧数
printf("brightness = %.2f\n",capture.get(CV_CAP_PROP_BRIGHTNESS)); //亮度
printf("contrast = %.2f\n",capture.get(CV_CAP_PROP_CONTRAST)); //对比度
printf("saturation = %.2f\n",capture.get(CV_CAP_PROP_SATURATION)); //饱和度
printf("hue = %.2f\n",capture.get(CV_CAP_PROP_HUE)); //色调
printf("exposure = %.2f\n",capture.get(CV_CAP_PROP_EXPOSURE)); //曝光
        while (1)
        {
                Mat frame;
capture >> frame;
namedWindow("video");
imshow("video",frame);
                c = cvWaitKey(30);
                if (c == 27)//Esc键退出
                {
                        break;
                }
        }
        return 0;
}

结果图如下:

在这里插入图片描述

在得到了最终截图后,需要各位将摄像头参数重新重新设置回来即可,在一般情况了运行调试了代码会更改电脑默认是设置参数,所以需要自行修改。

交流感想
2019.12.23 关于相机与计算平台选型一直是新手们的噩梦,又怕钱花了得不到需要的,在相机上基本可以认定选型一般在6mm 60度与8mm 45度这两个范围内(当然不排除其他战队使用长焦距打击的),一般来说都是用的普通的USB彩色相机(当然也有黑白的,但是需要对其单独做处理,同时还需要搭配滤光片)成本的话再200左右,运气好的话可以淘到150¥带索尼器件的产品(索尼大法好啊),在工业相机上基本都是用的大华、海康等面阵相机(不排除有人用基恩士这种神仙东西),同时网线相机据说帧率一直卡在30fps左右,还不如用USB的(也不清楚有没有提高帧率的,不敢问也不敢答),再一个是计算平台,用的是nuc的(我那自己掏钱买的minipc瞬间不香了),基本上从i5 7代处理器起底,8g够用,120G固态标配,至于买nuc还是买工控机(各个品牌的)或是tx2 妙算2啥的,个人感觉工控机(多USB口)性价比要好一点,但若是有深度学习等基础可能推荐妙算2(据说妙算2没多大区别,就多了个GPU模块),妙算2可以考虑拿来当无人机的计算平台(很想了解一下东北大学的法老之鹰搭载的啥计算平台!!)

2020.9.8 更新一下用过的