我还在 opencv.org 的问答论坛中发布了这个主题,但我不知道有多少专家正在阅读这个论坛 - 请原谅我也在尝试这里。
我目前正在学习 OpenCV,我目前的任务是测量放在盘子上的两个球之间的距离。我的下一步是比较几个相机和分辨率,以了解分辨率、噪声、失真等的重要性以及这些参数对精度的影响程度。如果社区对结果感兴趣,我很乐意在结果准备好后分享结果!使用广角镜头将相机放置在板上方。板的宽度和高度 (1500 x 700 mm) 和球的半径 (40 mm) 是已知的。
到目前为止我的步骤:
- 相机校准
- 使图像不失真(由于广角镜头,失真很高)
- findHomography:我使用板的角点作为输入(未失真图像中以像素为单位的 4 个点)和以毫米为单位的角点(从左下角的 0,0 开始,到右上角的 1500,700 )
- 使用 HoughCircles 在未失真图像中查找球
- 在圆心点上应用透视变换 => 圆心点现在以毫米为单位
- 计算两个中心点的距离:d = sqrt((x1-x2)^2+(y1-y2)^2)
结果:距离 300 mm 时误差约为 4 mm,距离 1000 mm 时误差约为 25 mm 但如果我测量的是印在印版上的矩形,则误差小于 0.2 mm,所以我猜测校准和不失真效果很好。
我想了想,想出了三个可能的原因:
- findHomography 应用于直接位于板上的点,而球的中心点应在赤道高度测量=> 如何更改 findHomography 的结果以改变这一点,即“移动”平面?以毫米为单位的半径是已知的。
- 误差随着球到光学中心的距离的增加而增加,因为相机不会从顶部看到球,所以图像的 2D 投影中的中心点与 3D 世界中的不同 - 我将我们投影进一步到图像的边界。=> 是否有任何几何运算可以应用于找到的中心来校正值?
- 在不失真期间,可能会丢失信息,因为我生成了一个新的未失真图像并返回到像素精度,尽管我在失真矩阵中有许多浮点值。我应该在失真图像中搜索球并只用失真矩阵变换中心点吗?但我不知道这个任务的代码是什么。
我希望有人可以帮助我改进这一点,我希望这个主题对其他 OpenCV 初学者来说很有趣。
谢谢和最好的问候!