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