【问题标题】:Apply remap only on coordinates obtained from distorted image and not on whole image仅对从失真图像而不是整个图像获得的坐标应用重映射
【发布时间】:2016-06-11 23:12:49
【问题描述】:

opencv 中的 initUndistortRectifyMap 函数会生成 x 和 y 方向的 maap,其中包含未失真像素的坐标,它根据固有相机矩阵、失真矩阵和旋转矩阵计算这些地图。

initUndistortRectifyMap(cam1,dst1,R1,P1, imageSize, CV_16SC2, map1x,map1y);

cam1(内在相机矩阵) dst1(失真系数) R1(旋转矩阵) map1x(图像大小的新图,表示移动的 x 坐标在未失真图像中的位置) map2x((图像大小的新映射,表示偏移的 y 坐标在未失真图像中的位置) 因此,如果在失真图像中新建图像坐标 (xdistort,ydistort) 可以使用

计算未失真的
x_undistort = map1x.at<short>(ydistort,xdistort);
y_undistort = map2x.at<short>(ydistort,xdistort);

我检查了未失真图像中的对应点,它们不会产生相同的点。我在 (0,0) 处检查了 map1x 的值,它包含负值,当我单击控制台查找坐标值时,它会从 (0:im_width,0:imheight) 给出相应的结果。是否有任何标准化程序?如何直接计算点而不处理整个图像。

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    像素的坐标是整数。所以将它们作为浮点数是没有意义的。

    如果你需要Point2f,你可以简单地从检索到的Point构造一个Point2f

    double minVal; double maxVal; Point minLoc; Point maxLoc;
    minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
    
    Point2f minLocF(minLoc);
    Point2f maxLocF(maxLoc);
    

    如果您需要具有该签名的函数,您可以将其应用到包装函数中,或者更改 OpenCV 源代码并重新编译(不推荐)。

    【讨论】:

    • 我在定位中需要亚像素精度,并且开发了许多算法来实现相同的目标,所以我不同意它是否毫无意义。
    • 当然,但是minMaxLoc 不使用亚像素精度。所以重载它毫无意义的。如果你想搜索具有亚像素精度的东西,你必须自己做。但是,我看不到如何以亚像素精度获得最大值像素
    • 是的,我明白你的意思。实际上,我正在进一步使用该值来计算一些平均值,但我同意 minmax 函数不会进行任何子像素计算并返回浮点值。谢谢,快速响应
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多