赞
踩
以下部分来自https://bbs.csdn.net/topics/392568506
小生毕设做双目测距的,看过了很多博客,最终是依照https://blog.csdn.net/xiao__run/article/details/78900652 这篇博客的代码为基础写的。用的是matlab标定,效果感觉还不错。但视差图的效果实在是差强人意,网上各种博客的视差图都是链接区域的快状,而我出来的都是零零散散,星星点点的形状,求问是哪个环节出了问题。以下为效果图 *****************************************************************************************************
本人也遇见这个问题了,详细讲讲这个问题。
仅仅讲讲本人遇见这个问题的根本原因,也可能有其它原因不在本次讨论范围。希望回答能造福后来者。
上结论:你买的摄像头有问题。
USB摄像头应用非常普遍,小作坊也能做,但是人员素质良莠不齐,只知道仿造,根本不懂摄像头知识。我们的摄像头是正规厂家,但是是定制的样品,所以出了点问题。
情况说明:公司要做双目测距避障,之前有一批摄像头,我们称old_camera.现在因出新产品,需要换摄像头 ,厂家提供了三个新摄像头样品,领导安排我做摄像头测试,称为new_camera.
old_camera和new_camera的区别:old_camera的电路板尺寸稍大,镜头焦距2.88mm,因为镜头底座短,镜头长度肉眼看比较短。
new_camera的电路板尺寸稍小,镜头焦距本来选的是2.97mm(最后证实3个样品都是2.88的),镜头底座长导致镜头长度肉眼看比较长。
厂家声称old_camera和new_camera就电路板尺寸大小和镜头焦距有差异,其它包括摄像头电路板固件,镜头感光sensor等等都是一样的,电路板只有大小区别,电路图设计一样。
用matlab作标定,old_camera的标定结果,fx和fy在950-965左右,标定误差0.3以内,随随便便做双目视觉效果就很好。new_camera的标定结果,多次标定fx在890-935之间变动,fy在950-965之间,标定误差也在0.3以内,无论怎么调试双目效果都不好,但是也不是完全不成功,我只有一次成功了,调的双目效果比较好,但是只是限定范围正确,原来是在室内测的,换个室外场景就错了。
因为我刚入职不了解情况,领导把old_camera和new_camera都给我了。电路板大小和镜头长度都不一样,我一直以为这是两款完全不同的摄像头。而且开始自身对摄像头知识有限,标定只知道看标定误差,不了解如何根据标定结果结合摄像头参数来做判断,所以早期双目视差图不好一直没找到原因,但是厂家,公司摄像头选型的同事一直以为两款摄像头除了焦距不一样基本没差别。直到后来实在解决不了问题,只能恶补摄像头和标定知识,才找到问题所在。
最终确定原因是摄像头本身问题。
那么为什么说new_camera这款摄像头有问题呢,因为只是定制的样品,厂家工作人员疏忽烧录错程序了,摄像头电路板的固件程序与镜头不匹配。
后来证实不仅电路板固件不对,镜头也是货不对版。
问题是怎么找到的呢?
开始我用new_camera来做,无论如何也做不好,又找不到原因,我当时分析是标定有问题,标定是matlab,过程没啥问题,只能是标定图片存在噪声引起的,但是外参是对的,标定误差也很小,我找厂家问过是不是标定图片存在噪声的问题,厂家回复USB摄像头就是这样的。后来领导也来试了发现确实不好调。然后安排我用new_camera的电路板配old_camera的镜头,结果我还是做不好。我想来想去,new_camera的电路板采集的最大分辨率是1856 * 800,那个old_camera的镜头采集的是2560 * 800,我就怀疑这两个能否适配的问题,后来跟厂家沟通,讲着讲着自相矛盾了才逐渐找到问题。
new_camera和old_camera的镜头sensor都是1/2(7.84mm * 2.4mm)大小,镜头sensor的像元大小都是3微米 * 3微米,两者都应输出2560*800的分辨率,old_camera电路板固件是正确的,输出了2560 * 800大小;new_camera的电路板固件是错误的,本该输出2560 * 800,但是实际输出了1856 * 800.
本来镜头感光面能采集2560 * 800,现在要采集1856 * 800(一般固件会有好几种预设图像分辨率,只要用的是其中一种那么是没问题的),且1856 * 800大小不是厂家设定的几种大小之一,那么1856 * 800就不确定采集的是哪一部分(仍然是取2560 * 800的中间部分,但是是随机的,可能这次采集的左右图像同时离中心偏左几个像素,下次又同时离中心偏右几个像素,表面看图像正常;但是如果你摄像头和标定板都固定好位置不变,本来你每一时刻拍的图像应该完全一样,但是现在你每一时刻拍的图像都是不同位置的,这种细微的差别肉眼根本看不出来。而且这种错误对标定误差没啥影响(左右相机是同步采集的,同一时刻采集的左右图像因为同时偏左或偏右所以对标定误差没影响,但是前后时刻采集的不一致,所以标定的相机内参是错的,最重要的是也不影响相机外参,外参也是正确的)。
大部分人水平有限,评定标定结果好坏都是根据标定误差,标定误差很小就认为标定效果好,实际这种方法看来有时并不靠谱。
那么怎么判定买的摄像头有问题呢,那我们就要讲讲摄像头的参数了,但是**注意啊,有些商家提供的摄像头参数可能有点小错误,**比如靶面尺寸实际1/2.5,写成1/2,甚至有时发错货,焦距2.88mm的当作2.97的发货。
1 摄像头参数:焦距:f 像元大小:px和py(最好选择px=py的,这里以px=py来讲例子),靶面尺寸sx * sy
2 摄像头的几种输出**分辨率 rx * ry,**比如2560 * 800,1280 * 400.可以用amcap查看。
2 标定结果fx,fy,cx,cy.
可以根据标定结果来评判摄像头是否有问题,也可以根据摄像头参数评定标定结果的好坏:
1. px * fx越接近f,py * fy越接近f越好,如果px=py的情况,fx要和fy非常接近才对。px * fx叫做相距,相距越接近焦距,成像越清楚。所以我们平时说调焦(指对焦,双目都是定焦),其实调的就是像距。这个尽量要准确。甚至可以根据这一条判断方法可以直接确定你买的摄像头是否对。比如商家说这款摄像头焦距是2.88,但是你实际到手的可能是2.97mm.这个差别你是看不出来的,而且焦距差0.09也不影响正常使用,不容易被发现,假设像元大小3微米 * 3微米为例,焦距2.88标定的fx和fy应该在950-970之间(960最正确),焦距2.97的fx在980-1000之间(990最正确)。商家发错货是很常见的。
2. 假设标定用图片是mx*my大小,那么cx越接近mx/2,cy越接近my/2越好,但是这条评价标准不太可靠,只要px * fx接近f,这里的cx和cy有时就算错大几十个像素都是可以的。
3.根据摄像头参数计算靶面大小看实际的数据和商家提供的参数是否一致,具体计算参照https://blog.csdn.net/weixin_44301520/article/details/134279097(工业相机基本知识理解:靶面尺寸、像元尺寸、分辨率)。
最后特别要讲的是就算视差图效果很好,不代表测距就很好,同一款摄像头(镜头和电路板都一样),电路板固件程序可能有好几种,有些适合运动速度比较快的场景,但是自动曝光控制差,图像质量差,测距没那么准确;有些测距相对准确但是不太适合摄像头需要快速运动的场景,有些远近距离相对都准确,有些只有很近距离才准确,稍远误差就大了。总是需要取舍的。自己咨询商家吧,商家如果只是卖摄像头的,可能只有一个电路板固件。毕竟我是直接对接摄像头厂家的.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。