如何使用给定的阈值对相似的色调进行分组? Smarties计数器projet

时间:2014-11-25 21:21:06

标签: opencv

我正在尝试使用给定的阈值将相似的色调组合在一起。除红色值外,它的效果非常好。由于在OpenCV中接近0或180表示红色,我很难在同一组中分组3度和179度色调。

色调存储在Vector中。

我创建了一个具有以下签名的函数。

Vector <uchar> getGroupedHues(Vector<uchar> hues, int threshold);

最终目标是创建一个智能手机柜台。我已经隔离了各个聪明人,现在我想找到每个人的色调来分类它们。

我使用page创建了代码。聚类色调的算法在最后,但就像我说的那样,我正在努力接近0/180度的值。

感谢您的帮助!

更新 这是我的代码。

// Creates a cluster of hues that are within a threshold
Vector<uchar> getClusteredHues(Vector<uchar> values, int threshold) {

    int nbBin = 180;
    Vector <uchar> groups(nbBin, 0);

    // Sorting the hues
    sort(values.begin(), values.end());

    Point2f previous = getPointFromAngle(values[0]);
    Point2f currentCluster = previous;

    Point2f currentValue;
    Point2f delta;

    Point2f thresholdXY = getPointFromAngle(threshold);

    groups[values[0]]++;

    for (int i = 1; i < values.size(); i++) {
        currentValue = getPointFromAngle( values[i]);

        delta = currentValue - previous;

        if (delta.x < thresholdXY.x && delta.y < thresholdXY.y) {
            groups[(int)(atan2(currentCluster.y, currentCluster.x)* 180 / CV_PI)]++;
        }
        else  {
            currentCluster = currentValue;
            groups[(int)(atan2(currentCluster.y, currentCluster.x)* 180 / CV_PI)]++;
        }

        previous = currentValue;

    }

    return groups;
}

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方法。我总是检查当前值是否接近结束限制,如果是,我当前组成为第一组。

这是代码。

Vector<uchar> getClusteredHues(Vector<uchar> values, int threshold) {

    int nbBin = 180;
    Vector <uchar> clusters(nbBin, 0);

    // trier les teintes
    sort(values.begin(), values.end());

    int previous = values[0];
    int currentCluster = previous;

    int currentValue;
    int delta;
    int halfThreshold = threshold / 2;
    int firstCluster = values[0];

    clusters[values[0]]++;

    for (int i = 1; i < values.size(); i++) {
        currentValue = values[i];

        delta = currentValue - previous;

        if (currentValue + threshold > nbBin) {
            if (abs(firstCluster - (currentValue + threshold - nbBin)) < threshold) {
                delta = 0;
                currentCluster = firstCluster;
            }
        }

        if (delta < threshold) {
            clusters[currentCluster]++;
        }
        else  {
            currentCluster = currentValue;
            clusters[currentCluster]++;
        }

        previous = currentValue;

    }

    return clusters;
}