这首先是集群问题 . 由于您不知道群集(组)的数量,因此必须使用一些不需要群集数量作为输入的算法 . 你可以做简单的cv::partition,它在C中有以下签名:
int cv::partition(const vector<_tp>& vec, vector& labels, _EqPredicate predicate=_EqPredicate())
Example of using it:
std::vector<:point> pixelCoordinatesTable,
std::vector labelsTable;
double threshold= 5;//Max eqludian distance between one cluster points
cv::partition(pixelCoordinatesTable, labelsTable, [&threshold](auto const& l, auto const& r){
return cv::norm(l - r))
});
另一个更成熟的选择是使用真正的聚类算法,如DBSCAN . 这是一种基于密度的聚类算法 . 你可以找到一个C implementation here .
获得集群后(在任何方法中)只需在每个 cluster 周围应用 cv::boundingRect 即可获得所需的 rectangle .
EDIT:
解决矩形问题:
auto cluster_count = cv::partition(cvCoordsTable, testVector, Dist(eqludianThreshold)); // gettting the number of clusters
std::vector<:rect> rectTable;
rectTable.reserve(cluster_count);//Optimiaztion
for(int in = 0; in < cluster_count; in++){
std::vector<:point> temp;
temp.reserve(testVector.size());
for(size_t i=0;i
if(testVector[i]==in){
temp.emplace_back(rectTable[i]);
}
}
rectTable.emplace_back(cv::boundingRect(temp));
}
我确信有更好更快的方法,我只是在解释这个想法,你可以尽可能优化它 .