【问题标题】:How to use double typed maps for remapping in OpenCV如何在 OpenCV 中使用双类型映射进行重新映射
【发布时间】:2018-10-12 14:36:59
【问题描述】:

cv::remap() 的问题:

我在图像坐标中使用双精度值,并希望使用 cv::remap() 来创建扭曲的图像。

但是,OpenCV 只允许我使用 CV_32FC1 (float) 作为地图类型,而不是 CV_64FC1 (double)。

除了在重新映射之前将我的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

【问题讨论】:

  • 使用 cv 转换例程?
  • 既然知道remap 需要浮点数,为什么还要使用双精度值而不是浮点数?
  • @DanMašek 我使用双精度值,因为此功能需要与软件包的其他部分兼容。
  • “为什么 openCV 不接受我的双精度值”——因为该函数不是为使用它们而设计的。很可能没有人发现额外的精度值得性能成本。 OpenCV 是开源的,因此如果您确实需要该功能,您可以对其进行补救(或者发布功能请求)。
  • 我正在回答它,无意冒犯。 :) 你会发现 OpenCV 中的其他函数也限制了它们支持的类型,有些颜色转换没有实现,有些函数可能没有 Python 绑定...

标签: c++ opencv floating-point double remap


【解决方案1】:

感谢@Yakk 的建议:

我用map.convertTo(map, CV_32FC1) 破解了一个变通办法,这对我来说非常好用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2020-05-16
    • 1970-01-01
    • 2022-01-12
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多