我可以在OpenCV中使用重映射获取点位置吗

koo*_*121 1 c++ opencv remap

我已经A使用RGB相机拍摄了照片。而且我知道g照片中点的位置A。相机需要进行相机校准。现在我想知道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   
Run Code Online (Sandbox Code Playgroud)

And*_*dov 5

只需从地图获取坐标:

x,y-映射前的坐标。

(map1(x,y),map2(x,y))-映射后的坐标

换一种说法:

  • map1.at<float>(y,x) 包含每个点p(x,y)的变换的x坐标。

  • map2.at<float>(y,x) 包含每个点p(x,y)的变换y坐标。

请参阅有关重映射功能的文档。

  • *这个答案不正确*。正如您引用的文档中所述,它是“dst(x,y)= src(map_x(x,y),map_y(x,y))”。转换点“dst -&gt; src”很容易(在“map_x”和“map_y”中查找),但OP想要另一个(更自然的)方向:“src -&gt; dst”。这确实令人困惑,因为 `cv::remap` 的工作原理是“相反”的(出于数值稳定性的原因)。即,为了映射图像“src -&gt; dst”,您需要提供“dst -&gt; src”的映射。不幸的是,这只有在转换规则网格(即图像)上的许多点时才有效。变换单个随机点是相当困难的。 (2认同)