概述
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的末尾,从末尾删除。
最后
以上就是沉静荔枝为你收集整理的opencv轮廓提取(边缘检测)后随机删除部分点,以减少运算量的全部内容,希望文章能够帮你解决opencv轮廓提取(边缘检测)后随机删除部分点,以减少运算量所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复