定义的box是左上角的x、y以及宽度w、高度h

iou计算出来的交集的w、h必须判断是否大于0,这避免了两个框没有交集的情况。如果不判断,可能存在w、h都为负生成iou>0的情况进而影响结果。

+1操作是计算像素点个数,这个地方其实有点没太理解到,但开源的代码都是这么写的。

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. using namespace std;
  7.  
  8. typedef struct Bbox{
  9. int x;
  10. int y;
  11. int w;
  12. int h;
  13. float score;
  14. }Bbox;
  15.  
  16. class Solution {
  17. public:
  18.  
  19. static bool sort_score(Bbox box1,Bbox box2){
  20. return box1.score > box2.score ? true : false;
  21. }
  22.  
  23. float iou(Bbox box1,Bbox box2){
  24. int x1 = max(box1.x,box2.x);
  25. int y1 = max(box1.y,box2.y);
  26. int x2 = min(box1.x+box1.w,box2.x+box2.w);
  27. int y2 = min(box1.y+box1.h,box2.y+box2.h);
  28. int w = max(,x2 - x1 + );
  29. int h = max(,y2 - y1 + );
  30. float over_area = w*h;
  31. return over_area/(box1.w * box1.h + box2.w * box2.h - over_area);
  32. }
  33.  
  34. vector<Bbox> nms(std::vector<Bbox>&vec_boxs,float threshold){
  35. vector<Bbox>results;
  36. std::sort(vec_boxs.begin(),vec_boxs.end(),sort_score);
  37. while(vec_boxs.size() > )
  38. {
  39. results.push_back(vec_boxs[]);
  40. int index = ;
  41. while(index < vec_boxs.size()){
  42. float iou_value = iou(vec_boxs[],vec_boxs[index]);
  43. cout << "iou:" << iou_value << endl;
  44. if(iou_value > threshold)
  45. vec_boxs.erase(vec_boxs.begin() + index);
  46. else
  47. index++;
  48. }
  49. vec_boxs.erase(vec_boxs.begin());
  50. }
  51. return results;
  52. }
  53. };
  54.  
  55. int main(){
  56. Solution a;
  57. vector<Bbox> input;
  58.  
  59. // Bbox box1 = {1,1,1,1,0.3};
  60. // Bbox box2 = {0,0,2,2,0.4};
  61. //Bbox box1 = {1,3,2,2,0.3}; //iou为负
  62. //Bbox box2 = {0,0,2,2,0.4};
  63. //Bbox box1 = {4,4,2,2,0.3};
  64. //Bbox box2 = {0,0,2,2,0.4};
  65. // Bbox box1 = {4,4,1,1,0.3};
  66. // Bbox box2 = {0,0,2,2,0.4};
  67. // Bbox box1 = {3,3,1,1,0.3};
  68. // Bbox box2 = {0,0,2,2,0.4};
  69. input.push_back(box1);
  70. input.push_back(box2);
  71. vector<Bbox> res;
  72. res = a.nms(input,0.3);
  73. // for(int i = 0;i < res.size();i++){
  74. // printf("%d %d %d %d %f",res[i].x,res[i].y,res[i].w,res[i].h,res[i].score);
  75. // cout << endl;
  76. // }
  77. return ;
  78. }

c++版 nms的更多相关文章

  1. YOLACT : 首个实时one-stage实例分割模型,29.8mAP/33.5fps | ICCV 2019

    论文巧妙地基于one-stage目标检测算法提出实时实例分割算法YOLACT,整体的架构设计十分轻量,在速度和效果上面达到很好的trade-off.   来源:[晓飞的算法工程笔记] 公众号 论文: ...

  2. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数006, image,影像处理(像素图)

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数006, image,影像处理(像素图) 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“* ...

  3. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数004·edge,边缘处理

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数004·edge,边缘处理 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“ ...

  4. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版

    <zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...

  5. 《zw版·delphi与halcon系列原创教程》zw版_THImagex控件函数列表

    <zw版·delphi与halcon系列原创教程>zw版_THImagex控件函数列表 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就要7w多行,但核心控件就是两 ...

  6. zw版_Halcon图像库delphi接口文件

    zw版_Halcon图像库delphi接口文件 Halcon图像库delphi接口文件,根据安装时用户设置的文件目录不同,会有所差异,笔者一般安装在delphi的import目录下.     参见:& ...

  7. 一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“啰里啰嗦版”)

    该篇为“啰里啰嗦版”,另有相应的“精简版”供参考 “不到长城非好汉:不做OS,枉为程序员” OS之于程序员,如同梵蒂冈之于天主教徒,那永远都是块神圣的领土.若今生不能亲历之,实乃憾事! 但是,圣域不是 ...

  8. 非极大值抑制(Non-Maximum Suppression,NMS)

    概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二 ...

  9. 非极大值抑制(NMS)

    转自:https://www.cnblogs.com/makefile/p/nms.html 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的 ...

随机推荐

  1. WPF流程图制作系列相关基础二

       我们现在知道 thumb ,可以让用户自行拖动其在 canvas上移动,在这个而基础上 我们可以试着往流程图方向靠近一下. 我们知道,流程图,都是一个一个的流程块,然后用线连起来的,这一个一个的 ...

  2. 分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC (转载 不错)

    分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC 1 一致性 1.1 简述 一致性,是指对每个节点一个数据的更新,整个集群都知道更新,并且是一致的 假设一个具有N个节点的分布式系统,当 ...

  3. 【学习笔记】--- 老男孩学Python,day10, 初识函数 形参、实参

    函数:对功能的封装语法: def 函数名(形参): 函数体 函数名(实参) 函数名:命名规则和变量一样 函数的返回值: return, 函数执行完毕. 不会执行后面逻辑 1. 如果函数中不写retur ...

  4. 在php中怎么利用js把参数传递给弹窗

    1.在php页面中经常用到把参数传递给弹窗页面,在弹窗页面中操作 2.两种方式,截图为一种 3.最常见的就是利用hideen隐藏域,点击按钮的时候把要传递的参数值传递给隐藏域,需要的时候在弹窗中获取. ...

  5. package.json中devDependencies与dependencies的区别

    前言:之前一直不懂既然都是项目的依赖,为什么要分成两个部分,devDependencies和dependencies,有什么区别? 安装方式 我们在通过npm安装插件或库时,有三种方式: npm in ...

  6. CSS选择器之基本选择器+属性选择器

    1.1      id选择器 #main{ font-size:12px; margin:0; padding:0; } 其中的#main就是id选择器,用于选择HTML页面中id = "m ...

  7. 五种常用web服务器jvm参数设置

     一.tomcat Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大.有以下几种方法可以选用:第一种方法:在配置文件中设置Windows下,在文件/bi ...

  8. linux 用户管理修改用户信息、密码状态、删除用户、退出登陆、切换用户

    修改用户信息usermoduseradd支持的选项usermod都支持passwd有两个选项-l(在密码串前面加了两个叹号),-u,usermod有两个选项:-L 临时锁定用户(Lock)(在密码串前 ...

  9. shell_basic

    1.回顾基础命令 2.脚本 3.变量 4.别名 5.条件判断 6.test判断   一.回顾基础命令 shutdown --关机/重启 exit --退出当前shell rmdir --删除空目录 d ...

  10. Linux 查看双节点是否做了SSH信任

    perl $AD_TOP/patch/115/bin/txkRunSSHSetup.pl verifyssh -contextfile=$CONTEXT_FILE -hosts=erpapp1,erp ...