我有vector<vector<Rect>>
。 Rect
是一个openCV矩形对象。我想填充一个空的vector<pair<Rect,int>>
,其中包含向量中重复(1次或多次出现)的所有矩形以及找到的出现次数。
我在下面的实施并没有给我预期的结果。这是我试过的:
vector<vector<Rect>> vec;
//...fill up vector vec...
vector<pair<Rect,int>> constantsVec;
bool found=false;
for(int j=0;j<vec.size()-1;j++){
vector<Rect> temp1=vec[j];
vector<Rect> temp2=vec[j+1];
for(int x=0;x<temp1.size();x++){
for(int y=0;y<temp2.size();y++){
if(temp1[x]==temp2[y]){
for(int k=0;k<constantsVec.size();k++){
if(constantsVec[k].first==temp1[x]){
found=true;
constantsVec[k]=make_pair(temp1[x],++constantsVec[k].second);
}
}
if(!found){
constantsVec.push_back(make_pair(temp1[x],0));
}
}
}
}
}
在一个重复三次的矩形的示例中,我最终得到constantsVec
中的正确矩形,但是找到的出现次数为1,而不是3。
我应该补充说vector<Rect>
向量本身的一个元素(vec
)本身没有重复的矩形,但在vec
向量的元素之间可以有重复的矩形。那些是我想要找到和计算的。
答案 0 :(得分:1)
在O(n·log n)中有效且可能最简单的方法是使用地图。
首先创建一个Rect
比较器以允许Rect
进行索引(将其置于可访问的位置):
// Needed for O(n · log n) complexity
struct RectComparator {
bool operator () (const Rect & a,const Rect & b) {
if (a.x != b.x) return a.x < b.x;
if (a.y != b.y) return a.y < b.y;
if (a.width != b.width) return a.width < b.width;
return a.height < b.height;
}
};
要计算Rect r
中vec
的{{1}}个数,请输入以下代码:
vector<vector<Rect> > vec;
//...fill up vector vec...
map<Rect, int, RectComparator> counts;
for (int i = 0; i < vec.size(); i++) {
for (int j = 0; j < vec[i].size(); j++) {
counts[vec[i][j]]++;
}
}
我没有检查vec[i][j]
上是否存在counts
,就好像它没有,默认情况下它被初始化为零。
最后,counts[r]
的{{1}}金额为Rect r
。
复杂性为vec
O(n · log n)
n
与Rect
对比vec
。{/ p>
要遍历O(n^2)
地图,这里是代码(如果需要,可以修改counts
,并且constantsVec
s出现多次):
Rect
考虑到构建和使用vector<pair<Rect, int> > constantsVec;
map<Rect, int>::iterator iter;
for (iter = counts.begin(); iter != counts.end(); ++iter) {
// iter->first is the Rect
// iter->second is the count of the Rect iter->first in vec
if (iter->second > 1)
constantsVec.push_back(make_pair(iter->first, iter->second));
}
只有在你多次使用它时才有意义,同时出现一次的矩形与出现不止一次的矩形之间的差异非常大。在其他情况下,使用constantsVec
地图应该与使用counts
。