OpenCV将所有负值转换为零

时间:2018-01-18 03:09:34

标签: c++ opencv

我想实现一个函数,它接受cv::Mat并将所有负值设置为零。执行此操作的最直接操作似乎是threshold函数记录here,因此函数pos(x)

void pos(cv::Mat x, cv::Mat result)
{           
    cv::threshold(x, result, 0, 0, CV_THRESH_TOZERO);
    return;
}

这是将所有负值设置为零还是有更快或更直接方式的最合适方式?

3 个答案:

答案 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;
}