RoboMaster机甲大师——视觉组——摄像头的选型与应用(Windows/ubuntu)
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 添加一个关于工业相机选型的一篇博客(很有价值,在参考文献中),同时分享一下跟深大视觉负责人一个下午设备选型的感想(后期可能会单独开一篇博客总结跟各个战队视觉组的交流感想)
按照使用背景来划分:
相机 | 说明 |
---|---|
普通USB相机 | |
工业级相机 |
按照色彩来划分:
相机色彩 | 说明 |
---|---|
彩色摄像头 | 适用于景物细部辨别,若物体景象的颜色。但又因为颜色而使其信息量增大,一般为黑白摄像头的10倍 |
黑白摄像头 | 适用于光线不足地区,若仅用于监视物体的运动与位置时,可选分辨率通常高于彩色摄像头 |
按照摄像头成像部件划分:
名称 | 信息读取方式 | 速度 | 电源及耗电量 | 成像质量 | 总结 |
---|---|---|---|---|---|
CCD | CCD电荷耦合器存储的电荷信息需要在同步信号控制下,一位一位地实旋转移后读取,电荷信息转移和读取输出需要有时钟控制电路和三组不同的电源相配合,整个电路较为复杂 | 在同步时钟的控制下,以行为单位一位一位地输出信息,速度较慢 | 需要三组电源供电,耗电量较大 | 由于该技术起步较早,重现质量相对于CMOS光电传感器有一定的优势 | 优势:成像质量好, 缺点:制造工艺复杂,成本贵 |
CMOS | CMOS光电传感器经光电转换后直接产生电流(或电压)信号,信号读取十分简单 | 在读取电信号的同时也可以处理各单元的图像信息,速度比CCD快很多 | 只需要一个电源,耗电量非常小,仅为CCD的1/8或1/10,CMOS光电传感器在节能方面有巨大的优势 | 近几年来电路消噪技术不断发展,成像质量也较为良好 | CMOS结构相对简单,与现有的大规模集成电路生成工艺相同,成本较低 |
本文主要说明一下CMOS摄像头的选型(后期说不定会更新CCD)
按照分辨率的大小来划分(彩色):
名称 | 分辨率 | 说明 |
---|---|---|
CIF | 352*288 | VCD画质 |
D1 | 704*576(120FPS) | DVD画质 |
HD 720P | 960720或1280720(60FPS) | 100万像素 |
HD 960P | 1280*1024(45FPS) | 130万像素 |
HD 1080P | 1920*1080(30FPS) | 200万像素 |
在RoboMaster比赛中,识别的速度尽量越快越好,即摄像头帧率尽量越高越好。而通常这些摄像头的帧率一方面受摄像头自身硬件属性影响例如做工、型号、快门类型等等,一方面受计算平台处理能力因素(需要注意的是你的编译运行方式也可以影响,例如VSxxxx DEBUG模式与RELEASE模式),另一方面则受分辨率的增加而减少(带宽限制)
一般来说,在同分辨率情况下,黑白摄像头>>彩色摄像头
在识别当真黑白摄像头只需要加滤光片再进行处理就行了,而彩色摄像头则需要利用HSV处理或是加减对应颜色通道值即可。
摄像头的基本结构
镜头:目前顶级摄像头的镜头采用的是五层‘’全玻‘’,镜头的组成即为透镜的结构,由几片透镜组成,一般分为塑胶透镜(P)与玻璃透镜(G)。透镜越多,成本也高;玻璃透镜比塑胶透镜贵,因此采用玻璃透镜的摄像头其成像效果相对于塑胶镜头会好一些,例如结构为1G2P三层透镜的镜头。
焦距来划分
参数/焦距 | |||||
---|---|---|---|---|---|
镜头毫米参数 | 4mm | 6mm | 8mm | 12mm | 16mm |
建议照射角度 | 70度 | 65度 | 40度 | 28度 | 20度 |
建议照射距离 | 0~5m | 5~10m | 10~20m | 20~35m | 30~50m |
按照焦距的不同又分为标准镜头、广角镜头和长焦距镜头
镜头类型 | 视角 | 焦距 | 说明 |
---|---|---|---|
标准镜头 | 50度 | 4~16mm | 这是人单眼在头和眼睛不转动情况下所能看到的视角,从标准镜头中观察的感觉跟人眼所见景物基本相同 |
广角镜头 | 50度 < X < 180度 | 4~24mm | 视角比较广,适用于距离近且范围大的景物,具有强烈远近感以及透视,例如超广角镜头(焦距24,视角84)以及鱼眼(焦距8,视角180) |
长焦距镜头 | 0~90度 | 0~1000mm | 用于获取远距离景物,景深较小,因此容易造成背景模糊,主体突出;其中135mm以下的为中焦距,常用与人像;135~500m为长焦距 ;500以上为超长焦距 |
通过选择镜头利用提高图像的成像质量,从而清楚地进行图像识别,
快门类型 | 读取方式 | 果冻效应 | 适用范围 |
---|---|---|---|
卷帘曝光 | 逐行数模转换 | 是 | 静止物体 |
全局曝光 | 50度 < X < 180度 | 否 | 运动物体 |
果冻效应:在照片和视频拍摄里都会出现,而且机械快门和电子快门都有,胶片相机也躲不掉,最明显的是物体扭曲,对应检测一个高速运动的物体来说,是毁灭性的灾难。其本质为CMOS读取速度过慢。大多数相机的最高同步速度都不超1/250秒,它的原本含义是机械快门幕帘跨越成像元件所需的时间,速度快于这个时间的快门实际上都不是全开的,可以参考下图进行理解:
上面一排是低速快门,也就是低于最快同步速度时,比如曝光1秒,可以看到快门是可以全开,感光元件最上和最下列会有同时曝光的情况,在这种情况下使用闪光灯,可以保证整个感光元件都能对受闪光灯照射的被摄物正确曝光。
下面一排是高速快门,比如1/8000秒,虽然快门需要1/250秒才能完全跨过感光元件,但只要将前后帘移动的时间差等同于你想要拍摄的快门时间,就能保证前后帘之间留出的缝隙扫过的感光元件区域都是你想要的曝光时间,所以同步速度的快慢对于快门速度没有影响。
CMOS最上面一排像素的曝光早于最下面一排接近1/250秒,对于高速运转的物体来说,1/250秒已经可以运动很长一段距离了,所以这就是果冻效应的一个根本原因,参考飞机果冻效应。而对闪光灯来说,因为没有快门全开,超过最快同步速度时均匀曝光成为几乎不可能的事情,虽然也有采用多次闪光脉冲的方式实现高速同步,但闪光功率会明显降低,限制比较多。
当然若是资金允许的话也可以选用工业相机来替代一般的USB摄像头。
国内有名的就是大华、海康之类的,国外则是基恩士等。
而工业相机的选型上则可以分为以下两种:
相机类型 | 图像细节决定因素 | 优缺点 | 适用范围 | 备注 |
---|---|---|---|---|
线阵相机 | 逐行数模转换 | 一维像元数可以做得很多,而总像元素较面阵相机少,而且像元尺寸比较灵活,帧幅数高,特别适用于一维动态目标的测量,成本昂贵,检测速度相对较低 | 大幅面高速运动或者滚轴等运动的特殊应用 | 线阵相机必须用可以支持线阵型相机的采集卡,而且一般应用于特殊环境下的检测 |
面阵相机 | 分辨率(焦距)决定 | 可以获取二维图像信息,测量图像直观,但像元总数多,而每行的像元数一般较线阵少,帧幅率受到限制,因此其应用面较广,如面积、形状、尺寸、位置,甚至温度等的测量。受生产技术制约,单个面阵面积很难达到一般工业测量现场的需求 | 静止检测或者一般低速的检测(RM比赛完全够用) |
由于受资金影响,本人亦没有太多工业相机的经验,可以参考下面-牧野-大佬的博客:
https://blog.csdn.net/dcrmg/article/details/52851913
工业相机基本参数以及选型参考(二)
帧率:一秒钟刷新图像的次数。曝光时间大于一帧的时间时,摄像头的帧率将会降低。所以若要摄像头帧率到达到标称值,必须手动调低曝光时间或是软件限制曝光值,若图像亮度过低,这需要调高曝光值或是增加补光灯,以便被拍摄物体增加亮度。
曝光:即图片芯片暴露在光线里时间的多少,曝光时间越长,图像芯片所得到的光电信号就会越强,图像质量就会越好。但是曝光时间大于一帧的时候,将会使摄像头帧率变低。
增益:即图像芯片所到的光电信号的放大倍数,增益值越大,图像光电信号放大得越强,图像也就越亮。但同时,放大倍数越大,噪声也会跟着一起放大,所以噪声点会增加很多,一般会通过算法或者硬件上将增益调低。
win10需要安装对应厂商提供的驱动,但是大多数厂商都是免驱的,需要驱动只需要联系对应厂商并下载相应驱动到桌面上是自动安装。
Linux下的摄像头驱动是V4L2,而调试摄像头参数的工具一般用qv4l2,它可以在程序运行时调节摄像头曝光
、帧速限制、尺寸、Gamma等。
qv4l2的安装(终端输入)
sudo apt install qv4l2
或是
sudo apt install v4l-utils
调用软件
v4l2-ctl
这是DJI开源视觉代码的摄像头驱动RMVideoCapture,跟VideoCapture作用一样,可以对摄像头的各种设置包括曝光、分辨率、帧率、图像格式等进行调整与设置,但据说DJI从2018年起就停止对其函数的维护,具体情况我也不是很清楚,但是这函数确实可以实现VideoCapture的功能
ubuntu在安装Opencv3时可能不会编译V4L2,所以我们需要对其进行手动编译(cmake GUI),在编译OpenCV3的时候选中WITH_V4L与WITH_LIBV4L
https://blog.csdn.net/guyii54/article/details/81041038
通过VideoCapture可以调用相关的参数,下面提供一个程序供大家了解如何调整摄像头常用的一些参数
(PS:这东西不分系统的win10与ubuntu皆通用,同时需要注意的是有些摄像头的参数并不能调值)
#include
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可以考虑拿来当无人机的计算平台(很想了解一下东北大学的法老之鹰搭载的啥计算平台!!)
补个链接:RoboMaster机甲大师——视觉组——摄像头的VideoCapture读取中cvGetCaptureProperty参数大全