我正在尝试使用给定的阈值将相似的色调分组在一起。除红色值外,它的效果都很好。由于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;
}

最佳答案

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

这是代码。

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

关于opencv - 如何将具有给定阈值的类似色相分组?聪明人反项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27136898/

10-10 03:55