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