我正在使用c++和OpenCV开发一个简单的"激光线"扫描仪。到目前为止我能发现激光线的中心,精度为1像素,所以我有一个可能的"亚像素"函数/算法的起点。(激光线约为。15-20pixels宽)
现在我有兴趣将其细化到亚像素精度。我知道OpenCV有一些亚像素检测功能,但据我所知这些只是用于检测角落。
如果有人有什么建议,我想听听。
一些信息;
-
系统:QT框架,c++, OpenCV库
-
相机;单色(无色),配红色滤镜
-
图像分辨率;2560 * 1920
-
注:激光线只分析一张图像
我使用过两种基本方法,并取得了良好的效果:
-
简单:在一帧上,阈值并定位包含激光条纹图像的区域,然后在每个图像行周围的强度最大值周围以小间隔(5-7个像素,取决于您的聚焦程度)拟合原始像素强度的抛物线。你的拟合程序必须有一个鲁棒器,因为异常值是可能的,例如,在具有显著镜面反射的场景区域附近。
-
如果你的相机帧率足够高(或者光束移动得足够慢),更难,但更精确:Curless的时空分析。
搜索"亚像素激光拟合"返回几个最近的结果。
在实用方面,密切注意饱和度:你的曝光时间(或镜头光圈)应该确保你的传感器不会饱和,即使光束击中物体表面最轻的部分。在信号被饱和截断的区域寻找峰值显然是没有意义的。
对焦(和景深)是另一个需要注意的地方——物体表面上光束的模糊图像会产生一个偏峰。