2013-05-01 150 views
3

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

现在我有兴趣将这个细化为亚像素精度。我知道OpenCV有一些 子像素检测功能,但据我所知这些只是用于检测 的角落。

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

有些信息;

  • 系统:QT框架,C++,OpenCV库

  • 摄像机; 单色(无色),配备红色滤镜

  • 图像分辨率; 2560 x 1920

  • 注意:只有1张图像将被分析为激光线。

+0

什么限制你一个像素的精度? – juanchopanza 2013-05-01 07:44:57

+0

我想输出一系列描述激光线扫描的(真实世界)coördinates。最终它将被用于测量目的。为了保证最高的精度,我需要确定亚像素精度中激光线的中心。 – phreak 2013-05-01 08:10:52

+0

我明白这一点。不清楚的是问题是什么。 – juanchopanza 2013-05-02 04:13:28

回答

6

有,我已具有良好的效果使用两种基本方法:

  • 容易:在一个帧中,阈值和找到包含激光条纹的图像的区域中,然后安装一个抛物线在每个图像行周围的亮度最大值附近的一个小间隔(5-7像素,取决于你的聚焦程度)的原始像素强度。你的配件程序必须有一个robartifier,因为异常值可能,例如近景区域有明显的镜面反射。

  • 如果摄像机的帧率足够高(或光束移动得足够缓慢),会更难但更精确:Curless的spacetime analysis

搜索“subpixel laser fitting”会返回几个最近的结果。在实际应用中,应密切关注饱和度:曝光时间(或镜头光圈)应确保即使光束撞击物体表面的最亮部分,传感器也不会饱和。在信号被饱和度限幅的区域内搜索峰值显然是毫无意义的。

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

+0

谢谢,我会研究一下! 目前正在尝试使用高斯拟合函数来确定子像素级别上激光线的质心。我仍然对建议tho感兴趣;).. – phreak 2013-05-02 06:15:38

+1

如果它符合您的请求,您应该upvote /接受答案。谢谢 – 2013-05-05 21:00:01