【发布时间】: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,因为需要再次考虑)-您想将其变成答案吗?当您不想回答时,也许我会自己回答。