4

我正在使用 C++ 和 OpenCV 开发一个简单的“激光线”扫描仪。到目前为止,我可以以 1 个像素的精度检测激光线的中心,因此我有一个可能的“亚像素”功能/算法的起点。(激光线宽约 15-20 像素)

现在我有兴趣将其改进为亚像素精度。我知道 OpenCV 有一些亚像素检测功能,但据我所知,这些仅用于检测角点。

如果有人有任何建议,我想听听他们的意见。

一些信息;

  • 系统:QT Framework、C++、OpenCV库

  • 相机; 单色(无颜色),配备红色滤光片

  • 图像分辨率;2560 x 1920

  • 注意:对于激光线,仅分析 1 个图像。

4

1 回答 1

9

我使用了两种基本方法,效果很好:

  • 简单:在一帧上,阈值并定位包含激光条纹图像的区域,然后在强度最大值附近的小间隔(5-7 像素,取决于您的聚焦程度)内将抛物线拟合到原始像素强度,在每个图像行。您的拟合例程必须具有鲁棒性,因为可能存在异常值,例如具有显着镜面反射的场景区域附近。

  • 如果您的相机的帧速率足够高(或光束移动足够慢),则更难但更精确:Curless 的时空分析

搜索“亚像素激光拟合”会返回几个最近的结果。

在实践方面,请密切注意饱和度:您的曝光时间(或镜头光圈)应确保即使光束击中物体表面最轻的部分,您的传感器也不会饱和。在信号被饱和削波的区域中寻找峰值显然是没有意义的。

聚焦(和景深)是其他需要注意的领域 - 物体表面上的光束图像模糊会产生偏差峰值。

于 2013-05-01T14:54:13.300 回答