我用RGB相机拍摄了一张照片A
。我知道照片A
中一个点g
的位置。相机需要做相机校准。现在我想知道校准后点g
的位置。我使用的代码如下,但我想得到点的位置,而不是图像。我怎么才能做到这一点?你能给予我一些建议吗?
initUndistortRectifyMap(
cameraMatrix,
distCoeffs,
Mat(),
Mat(),
Size(640, 480),
CV_32FC1,
map1, map2);
remap(A, B, map1, map2, cv::INTER_LINEAR);
Point2f g = Point2f(...,...);//i want to get the new position of the point not image B
字符串
4条答案
按热度按时间pepwfjgg1#
使用Map获取坐标:
x,y -之后的坐标(不是之前),正如pasbi在评论中正确注意到的那样,Map。
(map 1(y,x),map 2(y,x))-Map前的坐标
换句话说:
map1.at<float>(y,x)
包含每个目的地点p(x,y)的源x坐标。map2.at<float>(y,x)
包含每个目的地点p(x,y)的源y坐标。请参阅有关remap函数的文档。
f4t66c6m2#
undistortPoints()是您的需求。
字符串
如何获得点srcimg从dstimg就像pasbi评论如下.
2jcobegt3#
我发现最好的方法是重新创建一个相机矩阵,用反转的参数。在一定程度上工作,像基本的图像修改
af7jpaap4#
如果您使用
initUndistortRectifyMap
中的map1
和map2
来查找校准后点g
的新位置,则需要直接使用Map来调整点。然而,如前所述,有一种更有效的方法可以使用undistortPoints
函数来获取点g
的新位置。但让我们先关注更新您的原始答案。使用Map查找新位置的代码如下所示:
字符串
但是,我必须指出,上面代码中的最后一行可能无法按预期工作,因为
map1
包含定点坐标,它应该与remap
一起使用以重新Map整个图像。如果您想要Map单个点,则需要手动插值,这并不简单。因此,我建议使用
undistortPoints
,它是为此目的而设计的:型
现在,有了
g_undistorted
,你就有了点g
的正确位置,而不必处理整个图像。这比试图使用Map矩阵来调整单个点的位置更不容易出错,也更有效。