c++ 图像处理,用vector保留的点坐标值相互两两作比较,嵌套for循环实现了,但是效率不高,有什么方法可以提高效率,代码如下
c++ 图像处理,用vector保存的点坐标值相互两两作比较,嵌套for循环实现了,但是效率不高,有什么方法可以提高效率,代码如下
算法的目的:坐标与其他坐标一一比较,如果两坐标距离相差小于3就保存为一组点,如下面点(110, 110)
和其他点一一比较(包括自己),结果是(110, 110)(110, 111)(110, 110)(110, 112),现在可以实现,但是
如果我的点有上万个,嵌套for循环效率太低了,有什么方法改写可以提高效率,之前考虑过hashmap,因为
以前元素查重用过可以实现而且很快,但是现在元素比较是找一个范围不是相同,好像hashmap用不了,有什么
好的方法吗
------解决思路----------------------
你此处的纵、横坐标(二者其中之前有序)是否是有序的;如果是有序的话,可以据此筛掉一些不必要的计算;如果不是有序地,在多数据的情况下,可以考虑先排序,在进行判断,可以一定程度上提高效果;不清楚这里的坐标是否是图像像素坐标,如果是的话,只要领域进行判断就okay了
算法的目的:坐标与其他坐标一一比较,如果两坐标距离相差小于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了