我正在四处寻找这个问题的答案,但找不到一个答案,所以我在这里问。
问题:
我有一个激光从头顶投射到一个表面上,我想在这个表面上投射一些特定尺寸的形状。为此,我需要对激光器进行“校准”以使其在现实世界中接地。
激光在x和y方向上的投影坐标系统范围为-32000至32000。我在目标表面上设置了一个粗糙的矩形(有关更多详细信息,请参见下图)。目标以毫米为单位设置,并且是它们自己的坐标系。
我需要能够以毫米为单位获取点,并在一系列场景中将它们精确地控制在-32000到32000的范围内。
示例:
确定所需点的激光空间坐标最准确的方法是什么?
问题2:
不能保证投影空间是平坦的。它可以向任何方向倾斜。例如,如果抬高底部(相对于示例图片),则现实世界坐标在2-D中保持不变,但是所测量的激光坐标变得更像梯形。参见下图
如果有人遇到/解决了类似的问题,或者甚至可以开始为我指出正确的解决方案,将不胜感激。
谢谢!
答案 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);
如果您需要更多详细信息,请告诉我。