将投影点映射到现实世界点

时间:2018-09-26 05:30:37

标签: c# wpf transform transformation homography

我正在四处寻找这个问题的答案,但找不到一个答案,所以我在这里问。

问题:

我有一个激光从头顶投射到一个表面上,我想在这个表面上投射一些特定尺寸的形状。为此,我需要对激光器进行“校准”以使其在现实世界中接地。

激光在x和y方向上的投影坐标系统范围为-32000至32000。我在目标表面上设置了一个粗糙的矩形(有关更多详细信息,请参见下图)。目标以毫米为单位设置,并且是它们自己的坐标系。

我需要能够以毫米为单位获取点,并在一系列场景中将它们精确地控制在-32000到32000的范围内。

示例:

enter image description here

确定所需点的激光空间坐标最准确的方法是什么?

问题2:

不能保证投影空间是平坦的。它可以向任何方向倾斜。例如,如果抬高底部(相对于示例图片),则现实世界坐标在2-D中保持不变,但是所测量的激光坐标变得更像梯形。参见下图

enter image description here

如果有人遇到/解决了类似的问题,或者甚至可以开始为我指出正确的解决方案,将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

我在这里的帖子中遇到了同样的问题:https://gist.github.com/ZYinMD/860926a178ccd6d107ffe2c6727b5845

作为示例,我问了我要问图片的问题,因为它更易于解释,但是我将解决方案应用于设备在表面上的定位。它接近您想要做的事情。

基本上,您必须使用https://stackoverflow.com/a/52480400/9130280库(来自nuget)。

首先,您必须获得一个单应矩阵。您必须知道的唯一坐标是边。因此,您用边缘填充了两个数组,然后使用:

homographyMatrix = OpenCvSharp.Cv2.FindHomography(originalPointsList, targetPointsList);

然后将“毫米”中的任何点都等于激光坐标中的等效点:

targetPoint = OpenCvSharp.Cv2.PerspectiveTransform(orignalPoint, homographyMatrix);

如果您需要更多详细信息,请告诉我。