【问题标题】:Similar to std::transform function for cv::Mat in OpenCV类似于 OpenCV 中 cv::Mat 的 std::transform 函数
【发布时间】:2013-06-05 09:59:55
【问题描述】:

我想知道 OpenCV 中是否有任何函数,它与 STL 中的两个 cv::Mat 对象类似 std::tranform 一起运行?

例如,

cv::transform(src1, src2, dst, bin_function);

在哪里

  • src1src2 :相同大小的输入矩阵 (cv::Mat)。
  • dst :与输入相同的输出矩阵。
  • bin_function :接受两个元素作为参数(两个矩阵中的一个)并返回一些结果值的二进制函数或函数对象。

我试图在文档中搜索但没有找到这样的东西。

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    据我所知,OpenCV 中还没有这样的功能。但是,您可以在 cv::Mat 迭代器上使用 STL 算法 std::transform,如下所示:

    std::transform( src1.begin<float>(), src1.end<float>(), 
                    src2.begin<float>(), dest.begin<float>(), bin_function );
    

    确保使用正确的模板类型参数。因此,例如,如果您有一个 3 通道矩阵,每个通道有 8 位,则使用 Vec3b 而不是 float

    但请注意常见的 STL 陷阱。 src1src2dest 在调用 std::transform 之前应该具有相同数量的元素。如果您需要这种通用性,您可以考虑自己编写一个包装函数cv::transform,它会检查它,为dest 保留内存。动态地为模板参数找到正确的类型可能会很困难,因为bin_function 需要接受所有可能的参数。但是,如果您使用带有auto 参数的C++14 lambda,即使在某些特定情况下也是可能的。

    【讨论】:

    • 工作正常。仅供参考,在我的 OpenCV(2.4.9)版本中,无需指定迭代器类型(函数 begin 和 end 不是模板)。
    • 嗯,那就更好了。太棒了!
    • @brotherofken 什么?鉴于cv::Mat 的类型是在运行时确定的,那么如何正确键入它们?也许您正在使用cv::Mat_&lt;T&gt;
    • @ChristianRau 你在写。我正在使用 Mat1f。我没注意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    相关资源
    最近更新 更多