opencv不论是轮廓提取,还是边缘检测,都会得到很多点,一般来讲都会有几千个点,不论是查找直线,还是查找圆,对几千个点进行处理,都需要耗费很多时间。而很多时候,我们不需要这么多点,我们想要的结果是:随机的删除一些点,比如删除一半的点。

c++中vector容器用的较多,所有的点都存放在vector中,vector从末尾删除数据的效率很高,但是从中间删除的话,效率很低,如果从中间删除,3000个点中删除1500个点,估计会耗费几十ms的时间,这显然是不能够接受的。

本文提供的函数,可以实现vector中3000个点,删除1500个点,仅耗费不到1ms的时间,

下面贴出详细的代码,经过验证,可直接使用

欢迎大家交流


int chao_delete_part_point(vector<Point> &point_list, int delete_num)
{
int num = point_list.size() - delete_num;
if (num < 10) return 0;
int idx = point_list.size();
while (true)
{
idx--;
if (idx < num) break;
int idx1 = chao_get_rand_num(0, point_list.size() - 2);
swap(point_list[idx1], point_list[point_list.size() - 1]);
point_list.pop_back();
}
return 0;
}



int chao_get_rand_num(int min, int max)//得到min与max之间的随机整数
{
int num = rand() % (max - min + 1) + min;
return num;
}


相信看懂了之后,就觉得很简单,,就是把需要删除的点,替换到vector的末尾,从末尾删除。


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐