我想实现一个函数,它接受cv::Mat
并将所有负值设置为零。执行此操作的最直接操作似乎是threshold
函数记录here,因此函数pos(x)
void pos(cv::Mat x, cv::Mat result)
{
cv::threshold(x, result, 0, 0, CV_THRESH_TOZERO);
return;
}
这是将所有负值设置为零还是有更快或更直接方式的最合适方式?
答案 0 :(得分:2)
尝试pass reference other than value
,并使用CV_THRESH_TRUNC
:
void pos(cv::Mat &src, cv::Mat &dst)
{
cv::threshold(-src, dst, 0, 0, CV_THRESH_TRUNC);
dst = -dst;
return;
}
测试:
[-3, -2, -1;
0, 1, 2]
输出:
[0, 0, 0;
0, 1, 2]
<强>更新强>:
@Steve建议使用cv::max(x,0)
来截断矩阵。经过测试,它会更好。
void pos(Mat& src, Mat& dst){
dst = cv::max(src, 0);
return void;
}
答案 1 :(得分:1)
通过将矩阵数据类型从有符号转换为无符号,有一种更简单的方法可以忽略所有负数:
#result:after {content: counter()}
答案 2 :(得分:0)
它可能是可行的(?):
void pos(Mat& src, Mat& dst){
dst = 0.5*(cv::abs(src) + src);
return void;
}