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