opencv轮廓提取(边缘检测)后随机删除部分点,以减少运算量

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的末尾,从末尾删除。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值