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