我正在使用C ++和OpenCV开发一个简单的“激光线”扫描仪。到目前为止我可以检测到 激光线的中心,精度为1像素,所以我有一个可能的“子像素”功能/算法的起点。 (激光线宽约15-20像素)
现在我有兴趣将其提升到亚像素精度。我知道OpenCV有一些 子像素检测功能,但据我所知这些仅用于检测 角落。
如果有人有任何建议,我想听听。
一些信息;
系统: QT框架,C ++,OpenCV库
相机; 单色(无色),配备红色滤镜
图像分辨率; 2560 x 1920
注意:仅分析激光线的1张图像。
答案 0 :(得分:7)
我使用了两种基本方法,效果很好:
简单:在一帧,阈值和定位包含激光条纹图像的区域,然后在一个小间隔(5-7像素,根据您的聚焦程度,以5-7像素)拟合抛物线到原始像素强度在每个图像行的强度最大值附近。你的拟合程序必须有一个算法,因为异常值很可能,例如具有显着镜面反射的近场景区域。
更难,但如果你的相机的帧速率足够高(或光束移动得足够慢),则更精确:Curless spacetime analysis。
搜索“亚像素激光拟合”会返回几个最近的结果。
在实际方面,请密切注意饱和度:曝光时间(或镜头光圈)应确保即使光束照射到物体表面最轻的部分,传感器也不会饱和。在信号被饱和度削减的区域中搜索峰值显然是没有意义的。
聚焦(和景深)是需要注意的其他方面 - 物体表面上光束的模糊图像会产生偏差峰值。