赞
踩
1 利用 algorithm 中的 min max 函数
2 利用opencv 中的 | 和 & 运算
- #include<iostream>
- #include<algorithm>
- #include<vector>
-
- #include<opencv2/opencv.hpp>
-
- using namespace std;
-
- struct bbox
- {
- int m_left;
- int m_top;
- int m_width;
- int m_height;
-
- bbox() {}
- bbox(int left, int top, int width, int height)
- {
- m_left = left;
- m_top = top;
- m_width = width;
- m_height = height;
- }
- };
-
- float IOU(const bbox& b1, const bbox& b2)
- {
- float w = std::min(b1.m_left + b1.m_width, b2.m_left + b2.m_width)
- - std::max(b1.m_left, b2.m_left);
- float h = std::min(b1.m_top + b1.m_height, b2.m_top + b2.m_height)
- - std::max(b1.m_top, b2.m_top);
-
-
- if (w <= 0 || h <= 0)
- return 0;
-
- std::cout << "w :" << w << "h :" << h << std::endl;
-
- return (w * h) / ((b1.m_height * b1.m_width) + (b2.m_height * b2.m_width) - (w * h));
- }
- float IOU_cv(const cv::Rect & r1,const cv::Rect & r2)
- {
- cv::Rect and = r1 | r2;
- cv::Rect U = r1 & r2;
-
- return U.area()*1.0 / and.area();
- }
-
- int main()
- {
- bbox b1(0, 0, 40, 20);
- bbox b2(30,10,40,20);
-
-
- float iou = IOU(b1, b2);
- std::cout << "IOU :" << iou << std::endl;
-
- cv::Rect r1(0,0,40,20);
- cv::Rect r2(30,10,40,20);
-
- float iou_cv = IOU_cv(r1,r2);
- std::cout << "IOU_cv :" << iou << std::endl;
-
- system("pause");
- return 0;
- }
参考:
https://my.oschina.net/u/3800567/blog/1795889
https://blog.csdn.net/ifreewolf_csdn/article/details/89004662
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。