有许多校准教程可用于校准 EMGU (OpenCV) 中棋盘的相机图像。它们最终都会校准图像,然后消除图像失真以供显示。这很酷,但我需要进行机器视觉,在其中拍摄图像,识别图像中角点、斑点或特征的位置,然后将该特征的位置(以像素为单位)转换为现实世界的 X、Y 坐标。
像素 -> 毫米。
EMGU 可以做到这一点吗?如果是这样,怎么办?我不想花大量时间学习 EMGU,但却无法完成这个关键功能。
是的,作为 OpenCV 的“面包和黄油”,这当然是可能的。
您所描述的校准,就消除失真而言,是此过程的先决条件。之后,以下内容适用:
内在校准或“相机矩阵”是两个必需矩阵中的第一个。第二个是相机的外部校准,本质上是 6 DoF 变换,描述传感器中心相对于坐标参考系的物理位置。
所有畸变系数、内在和外在校准都可以通过 Emgu.CV 中的单个函数获得:CvInvoke.CalibrateCamera 我相信,您所描述的众多可用教程之一可以很好地解释此过程.
之后,就像CvInvoke.ProjectPoints一样简单地应用上面的变换并从 2D 像素位置生成 3D 坐标。
成功做到这一点的关键是提供全面的
IInputArray objectPoints
和IInputArray imagePoints
到CvInvoke.CalibrateCamera
。一定要从许多不同的角度使用许多图像来引起“兴奋”。
但是当我使用 CvInvoke.ProjectPoints 时,它会给我投影的 2D 坐标。请问如何使用它来获取真实的3D坐标?