【问题标题】:efficient replacement for m2=(m1==v) for cv::UMat?cv::UMat 的 m2=(m1==v) 的有效替换?
【发布时间】:2019-05-16 07:58:15
【问题描述】:

我得到以下代码(示例)来创建一个使用 cv:Mat: 的掩码:

int v;
cv::Mat m1; // being a submat
cv::Mat mask = (m1==v);

这些行来自python原型

mask = np.where( m1[x1:x2,y1:y2]==v, 255, 0 );

在 c++ 版本中,我想使用 UMat 而不是 Mat,因为这一行周围有一个更大的处理管道。可悲的是,在我看来,MatExpressions(如上面的m1==v)并未在 OpenCV3.4.1 中为 cv::UMat 实现。对吗?

cv::UMat 上是否有可用的操作,我可以有效地模仿 mask=(m1==v) 以获得相同的掩码?
我当前的代码(从 UMat 转换为 Mat,即从图形内存复制到主内存,然后执行 cv::Mat 操作)效率不高。

使用c++11、gcc5.4.0、opencv3.4.1

注意:问题不在于 python 和 c++ 版本之间掩码中的值可能不同。

【问题讨论】:

  • 你不能使用threshold函数吗,比如threshold(m1, mask, v, 255, THRESH_BINARY)
  • @dhanushka 是的,你是对的,我可能会使用两个阈值语句:threshold( m1, mask, v, v, THRESH_TOZERO_INV );threshold( mask, mask, v-1, 255, THRESH_BINARY ); 这不是很优雅,但它应该可以完成这项工作并且比复制到主内存中要快得多.谢谢。
  • 可能是cv::compare?
  • @DanMašek ,您的评论再次帮助了我(审查了我的问题 + cmets,因为需要再次考虑)-您想将其变成答案吗?当您不想回答时,也许我会自己回答。

标签: c++ opencv mat


【解决方案1】:

正如@DanMašek 正确指出的那样,cv::compare 在这种情况下是我的朋友:

// having some UMat m1 and some (let's say) double v
cv::UMat mask;
cv::compare( m1, cv::Scalar{v}, mask, cv::CMP_EQ );

【讨论】:

    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2020-09-18
    • 1970-01-01
    相关资源
    最近更新 更多