c++ 图像处理,用vector保留的点坐标值相互两两作比较,嵌套for循环实现了,但是效率不高,有什么方法可以提高效率,代码如下

c++ 图像处理,用vector保存的点坐标值相互两两作比较,嵌套for循环实现了,但是效率不高,有什么方法可以提高效率,代码如下
本帖最后由 u010947001 于 2015-06-20 15:17:41 编辑
算法的目的:坐标与其他坐标一一比较,如果两坐标距离相差小于3就保存为一组点,如下面点(110, 110)
和其他点一一比较(包括自己),结果是(110, 110)(110, 111)(110, 110)(110, 112),现在可以实现,但是
如果我的点有上万个,嵌套for循环效率太低了,有什么方法改写可以提高效率,之前考虑过hashmap,因为
以前元素查重用过可以实现而且很快,但是现在元素比较是找一个范围不是相同,好像hashmap用不了,有什么
好的方法吗


#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;

int main()
{

vector<Point>  p;
vector<Point> temp;
vector<vector<Point> > centerbox;

p.push_back(Point(110, 110));
p.push_back(Point(110, 111));
p.push_back(Point(110, 110));
p.push_back(Point(110, 112));
p.push_back(Point(111, 112));
p.push_back(Point(150, 111));


for (vector<Point> ::iterator iter1 = p.begin(); iter1 != p.end(); ++iter1) {


for (vector<Point> ::iterator iter2 = p.begin(); iter2 != p.end();) {



if (abs((*iter1).x - (*iter2).x) + abs((*iter1).y - (*iter2).y) < 3) {

temp.push_back((*iter2));
++iter2;
}
else {
++iter2;
}
}


centerbox.push_back(temp);

temp.clear();

}
        
        return 0;
}

------解决思路----------------------
你此处的纵、横坐标(二者其中之前有序)是否是有序的;如果是有序的话,可以据此筛掉一些不必要的计算;如果不是有序地,在多数据的情况下,可以考虑先排序,在进行判断,可以一定程度上提高效果;不清楚这里的坐标是否是图像像素坐标,如果是的话,只要领域进行判断就okay了