RoboMaster视觉教程(1)
摄像头
摄像头参数
主流有CCD和CMOS摄像头,一般而言CCD摄像头体积大造价高精度高,而CMOS摄像头由于集成度高造价远低于CCD摄像头,同时CMOS摄像头的体积功耗等参数也相应地优于CCD摄像头。Robo一般用Cmos摄像头
卷帘曝光与全局曝光
通常我们在网上买到的摄像头都是卷帘曝光的摄像头,在日常使用时很难看出这两种摄像头的区别,但是在对速度要求高的领域这两种曝光方式的优劣就很明显了,
> 1、尤其是对于廉价的摄像头卷帘曝光的果冻效应更加明显。
> 2、除了果冻效应外,全局曝光的摄像头在低曝光时间的情况下的颜色饱和度更高
曝光
当我们拍摄能自主发光的物体时,降低曝光时间可以减少环境光的影响。这时通过阈值处理得到二值图就可以进一步处理。
可以明显对比到二者中第二个环境光的影响减少了
Gamma矫正
在上面提到曝光可以减少环境光的影响时候,忽略了一个问题就是我们能看到的中间的数字1的光线,也是环境光的一部分。低曝的时候也很容易让数字彻底看不见如下最左图。
对此一种解决方法是:提高摄像头的Gamma值。
当Gamma提高时图像中亮度较低的区域的亮度会被提高。
实现方法如下:
可以简单理解该图:提高Gamma后。像素亮度越低,提高速度越快,像素亮度越高,提高速度越慢。所以提高Gamma后对比度下降。我们就可以看到4了。
与此同时观察到图中被提高亮度后,背景杂光提高后和数字四还是有很大的边缘阈值对比度很明显。只要我们提高对比度到适合程度,然后再选取杂光中最亮的像素值减去原图就可以消去杂光。再提高对比度即可
帧率与摄像头选型
对于RoboMaster比赛而言,识别的速度当然是越快越好,所以摄像头帧率也是越高越好。由于带宽的限制帧率和分辨率通常互相制约,想要高帧率分辨率就会低。
在实战中我们一般用分辨率640*480左右的图片,用彩色卷帘相机
镜头
镜头焦距一般用6mm或8mm左右的镜头比较合适,在这个焦距下3m左右的装甲板拍的很清楚。
Linux摄像头驱动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62#pragma execution_character_set("utf-8") #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> int main() { cv::VideoCapture capDevice(0); capDevice.open(0); //设置摄像头采集图像分辨率 capDevice.set(cv::CAP_PROP_FRAME_WIDTH, 1024.0); capDevice.set(cv::CAP_PROP_FRAME_HEIGHT, 960.0); capDevice.set(cv::CAP_PROP_FRAME_WIDTH, 1080);//宽度 capDevice.set(cv::CAP_PROP_FRAME_HEIGHT, 960);//高度 //capDevice.set(cv::CAP_PROP_FPS, 30);//帧率 帧/秒 capDevice.set(cv::CAP_PROP_BRIGHTNESS, 1);//亮度 1 capDevice.set(cv::CAP_PROP_CONTRAST, 60);//对比度 40 capDevice.set(cv::CAP_PROP_SATURATION, 64);//饱和度 50 capDevice.set(cv::CAP_PROP_HUE, 0);//色调 capDevice.set(cv::CAP_PROP_EXPOSURE, -7);//曝光 50 cv::Mat srcImage; //宽度 double width = capDevice.get(cv::CAP_PROP_FRAME_WIDTH); //高度 double height = capDevice.get(cv::CAP_PROP_FRAME_HEIGHT); //帧率 帧/秒 //int fps = capDevice.get(cv::CAP_PROP_FPS); //亮度 double bright = capDevice.get(cv::CAP_PROP_BRIGHTNESS); //对比度 double contrast = capDevice.get(cv::CAP_PROP_CONTRAST); //饱和度 double saturation = capDevice.get(cv::CAP_PROP_SATURATION); //色调 double hue = capDevice.get(cv::CAP_PROP_HUE); //曝光时长 double exposure = capDevice.get(cv::CAP_PROP_EXPOSURE); //设置绘制文本的相关参数 char text[255] = ""; int font_face = cv::FONT_HERSHEY_COMPLEX; double font_scale = 1; int thickness = 1; while (true) { if (capDevice.isOpened()) { capDevice >> srcImage; } sprintf(text, "width:%0.1f height:%0.1f exposure:%0.1f", width, height, exposure); cv::putText(srcImage, text, cv::Point(20, 30), font_face, font_scale, cv::Scalar(0, 255, 255), thickness, 8, 0); sprintf(text, "bright:%0.1f contrast:%0.1f saturation:%0.1f hue:%0.1f", bright, contrast, saturation, hue); cv::putText(srcImage, text, cv::Point(20, 90), font_face, font_scale, cv::Scalar(0, 255, 255), thickness, 8, 0); imshow("image", srcImage); cv::waitKey(30); } }``
代码来源:https://www.so.com/s?ie=utf-8&src=360se7_addr&q=opencv4%E7%9A%84%E6%91%84%E5%83%8F%E5%A4%B4video.set
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
参考博客:https://blog.csdn.net/u010750137/article/details/96428059
最后
以上就是活泼蓝天最近收集整理的关于RoboMaster 视觉 摄像头教程的全部内容,更多相关RoboMaster内容请搜索靠谱客的其他文章。
发表评论 取消回复