65,208
社区成员
发帖
与我相关
我的任务
分享#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;
}
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));
变成
map<Point,Point> p
p[Point(110, 110)] = Point(110, 110);
p[Point(110, 111)] = Point(110, 111);
p[Point(150, 110)] = Point(150, 110);
...
对于任意一个点(x,y);
他的周围13个点都是:
(x-2,y)
(x-1,y-1),(x-1,y),(x-1,y+1)
(x,y-2),(x,y-1), (x,y), (x,y+1), (x,y+2)
(x+1,y-1),(x+1,y),(x+1,y+1)
(x+2,y)
分别判断每个点 是否在上面的map<Point,Point> p中
[/quote]
LZ的意思应该是在纠结这十三个点如何从数据结构中找出来。这取决于所有的点是如何存储的,如果是按照图像的点阵顺序存储的,就方便找这些点了,所以我觉得也可以从存储的结构上找出路
[/quote]
从map中找一个点是否存在,已经很快了, 2的13次方 = 8192,说明:
1万多个点,从map中判断一个点存不存在,最坏情况是2分搜13次就可以确定一个点是否在所有点列表
那么总时间就是: 判断每个点是否存在搜13次 × 周围12个点 × 1万个待判断的点
如果楼主觉得想把这13次再优化一下,那么就用位图好了,一个字节表示8个点:如下可以表示一个8×8的点阵
1表示有点,0表示没点
01000010 = 66 // 表示第0行第1列有点(0,1),第0行第6列有点(0,6)
10101000 = 168 // 表示第1行第0列有点(1,0),第1行第2列有点(1,2),第1行第4列有点(1,4)
00101010 = 42 // 表示第2行第2列有点(2,2),第2行第4列有点(2,4),第2行第6列有点(2,6)
10100010 // 依次类推
00101010
01001010
比如你的图像是1000×1000个点,那么位图的大小就是 bitmap[1000 / 8][1000] = 125KB的一个2维数组
对于任意一个点(x,y) (x<1000,y<1000),它在位图中对应的2进制位就是 :(bitmap[x/8][y] << (x%8)) &0x80 为0则表示没点,否则为有点。
这样你根据点坐标,可以直接位运算出来一个点是否存在,这个时间复杂度已经是O(1)
那么总时间就是: 周围12个点 × 1万个待判断的点
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));
变成
map<Point,Point> p
p[Point(110, 110)] = Point(110, 110);
p[Point(110, 111)] = Point(110, 111);
p[Point(150, 110)] = Point(150, 110);
...
对于任意一个点(x,y);
他的周围13个点都是:
(x-2,y)
(x-1,y-1),(x-1,y),(x-1,y+1)
(x,y-2),(x,y-1), (x,y), (x,y+1), (x,y+2)
(x+1,y-1),(x+1,y),(x+1,y+1)
(x+2,y)
分别判断每个点 是否在上面的map<Point,Point> p中
[/quote]
LZ的意思应该是在纠结这十三个点如何从数据结构中找出来。这取决于所有的点是如何存储的,如果是按照图像的点阵顺序存储的,就方便找这些点了,所以我觉得也可以从存储的结构上找出路
[/quote]
从map中找一个点是否存在,已经很快了, 2的13次方 = 8192,说明:
1万多个点,从map中判断一个点存不存在,最坏情况是2分搜13次就可以确定一个点是否在所有点列表
那么总时间就是: 判断每个点是否存在搜13次 × 周围12个点 × 1万个待判断的点
如果楼主觉得想把这13次再优化一下,那么就用位图好了,一个字节表示8个点:如下可以表示一个8×8的点阵
1表示有点,0表示没点
01000010 = 66 // 表示第0行第1列有点(0,1),第0行第6列有点(0,6)
10101000 = 168 // 表示第1行第0列有点(1,0),第1行第2列有点(1,2),第1行第4列有点(1,4)
00101010 = 42 // 表示第2行第2列有点(2,2),第2行第4列有点(2,4),第2行第6列有点(2,6)
10100010 // 依次类推
00101010
01001010
比如你的图像是1000×1000个点,那么位图的大小就是 bitmap[1000 / 8][1000] = 125KB的一个2维数组
对于任意一个点(x,y) (x<1000,y<1000),它在位图中对应的2进制位就是 :(bitmap[x/8][y] << (x%8)) &0x80 为0则表示没点,否则为有点。
这样你根据点坐标,可以直接位运算出来一个点是否存在,这个时间复杂度已经是O(1)
那么总时间就是: 周围12个点 × 1万个待判断的点
[/quote]
真的非常谢谢你们,我好好消化一下内容!!
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));
变成
map<Point,Point> p
p[Point(110, 110)] = Point(110, 110);
p[Point(110, 111)] = Point(110, 111);
p[Point(150, 110)] = Point(150, 110);
...
对于任意一个点(x,y);
他的周围13个点都是:
(x-2,y)
(x-1,y-1),(x-1,y),(x-1,y+1)
(x,y-2),(x,y-1), (x,y), (x,y+1), (x,y+2)
(x+1,y-1),(x+1,y),(x+1,y+1)
(x+2,y)
分别判断每个点 是否在上面的map<Point,Point> p中
[/quote]
LZ的意思应该是在纠结这十三个点如何从数据结构中找出来。这取决于所有的点是如何存储的,如果是按照图像的点阵顺序存储的,就方便找这些点了,所以我觉得也可以从存储的结构上找出路
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));
变成
map<Point,Point> p
p[Point(110, 110)] = Point(110, 110);
p[Point(110, 111)] = Point(110, 111);
p[Point(150, 110)] = Point(150, 110);
...
对于任意一个点(x,y);
他的周围13个点都是:
(x-2,y)
(x-1,y-1),(x-1,y),(x-1,y+1)
(x,y-2),(x,y-1), (x,y), (x,y+1), (x,y+2)
(x+1,y-1),(x+1,y),(x+1,y+1)
(x+2,y)
分别判断每个点 是否在上面的map<Point,Point> p中
if (abs((*iter1).x - (*iter2).x) + abs((*iter1).y - (*iter2).y) < 3)
我不知道,你的这个 3 , 这个条件是不是固定的。
如果是固定的, 那么一个点周围,按照你的条件,和它距离小于3的点, 最多也就 1+3+5+3+1 = 13 个点
也就是说, 当你取一个点(x,y)出来做判断的时候, 你只需要判断:
在(x-2,y) ,(x+2,y) ,(x,y-2),(x,y+2) 这个矩形区域的13个点(这其中还包括被判断的点自己,实际上就是周围12个点),
在不在你的所有点列表中,那么就算你有1万个点, 就是判断12万次, 而不是双重循环(1万×1万那得判断1亿次)