如何在OpenCV中实现signum功能?

时间:2014-08-28 04:07:37

标签: android opencv math

dst = signum(src)函数将src中所有正元素的值设置为1,将所有负元素的值设置为-1

但是,似乎无法通过应用OpenCV函数signum()来实现threshold()函数。我也不想遍历src,因为它效率低下。

1 个答案:

答案 0 :(得分:5)

我不知道您使用的是哪种语言,但在OpenCV C ++中,signum函数可以实现如下:

Mat signum(Mat src)
{
    Mat dst = (src >= 0) & 1;
    dst.convertTo(dst,CV_32F, 2.0, -1.0);
    return dst;
}

当然,返回的矩阵将具有浮点或有符号类型以存储值-1。

更新

前一个实现仅返回1或-1,具体取决于输入值,但根据signum定义,0应在输出中保持为0。因此,从this answer获取引用,可以使用OpenCV实现标准signum函数:

Mat signum(Mat src)
{
    Mat z = Mat::zeros(src.size(), src.type()); 
    Mat a = (z < src) & 1;
    Mat b = (src < z) & 1;

    Mat dst;
    addWeighted(a,1.0,b,-1.0,0.0,dst, CV_32F);
    return dst;
}