如何在OpenCV中使用双重类型的地图重新映射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在OpenCV中使用双重类型的地图重新映射相关的知识,希望对你有一定的参考价值。

cv::remap()的问题:

我正在为我的图像坐标使用双值,并希望cv::remap()那些创建一个扭曲的图像。

然而,OpenCV只允许我使用CV_32FC1float)作为地图类型,而不是CV_64FC1double)。

除了在重新映射和使用double的浮点型地图之前将我的float值强制转换为cv::remap()之外,还有另外一种方法吗?

代码片段:

Eigen::Vector2d distort(Eigen::Vector2d & pointUndistorted);    

int main(int argc, char** argv) {
    cv::Mat image, dst;
    image = cv::imread(argv[1], 1);
    Eigen::Vector2d pointUndistorted;
    Eigen::Vector2d pointDistorted;
    int w = image.rows;
    int h = image.cols;
    cv::Mat map1(w,h,CV_64FC1);
    cv::Mat map2(w,h,CV_64FC1);

    for (int wIdx = 0; wIdx < w; ++wIdx)
    {
        for (int hIdx = 0; hIdx < h; ++hIdx)
        {
            pointUndistorted << (double)wIdx / (double)w -0.5, (double)hIdx / (double)h -0.5;
            pointDistorted = distort(pointUndistorted);

            map1.at<double>(wIdx,hIdx) = (pointDistorted[0] + 0.5) * h;
            map2.at<double>(wIdx,hIdx) = (pointDistorted[1] + 0.5) * w;
        }
    }

    cv::remap(image, dst, map1, map2, cv::INTER_LINEAR);
}

这给了我以下错误:

OpenCV错误:断言失败(((map1.type()==(((5)&((1 << 3) - 1))+(((2)-1)<< 3))|| map1。 type()==(((3)&((1 << 3) - 1))+(((2)-1)<< 3)))&& map2.empty())||(map1.type ()==(((5)&((1 << 3) - 1))+(((1)-1)<< 3))&& map2.type()==(((5)&( (1 << 3) - 1))+(((1)-1)<< 3))))重映射,文件/tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/imgproc/src /imgwarp.cpp,第1840行

答案

感谢@Yakk的建议:

我用map.convertTo(map, CV_32FC1)破解了一个解决方案,这对我来说非常好。

以上是关于如何在OpenCV中使用双重类型的地图重新映射的主要内容,如果未能解决你的问题,请参考以下文章

opencv InitUndistortRectifyMap 地图大小

使用链接地图/传递映射/链式地图的 AutoMapper 地图

如何在带有向量作为值类型的地图中添加值?

OpenCV2.1,地图功能?访问每个像素?

配置单元中的映射类型变量

无法修改HERE地图重新路由选项