赞
踩
如果你的项目方便使用OpenCV, 对两个cv::Rect求交集,非常简单:
#include <opencv/opencv2>
cv::Rect src1 = {0,0,10,10};
cv::Rect src2 = {2,2,10,10};
cv::Rect dst = src1 & src2; // {2,2,8,8}
// 如果不相交,dst.width、dst.height就都是0
如果不能使用OpenCV, 可以用array或vector盛放矩形的xywh,然后使用下面的函数计算:
#include <cstring>
#include <vector>
/*
func: get intersection arar rect of src1 and src2
Param: src1, src2. has 4 elems each, means: xywh
return: dst
*/
template<typename _Tp> inline
void get_intersection(const _Tp* src1, const _Tp* src2, _Tp* dst)
{
dst[0] = std::max(src1[0], src2[0]);
dst[1] = std::max(src1[1], src2[1]);
dst[2] = std::min(src1[0] + src1[2], src2[0] + src2[2]) - dst[0];
dst[3] = std::min(src1[1] + src1[3], src2[1] + src2[3]) - dst[1];
if (dst[2] <= 0 || dst[3] <= 0)
memset(dst, (_Tp)0, sizeof(_Tp) * 4);
}
template<typename _Tp> inline
void get_intersection(const std::vector<_Tp> &src1, const std::vector<_Tp> &src2, std::vector<_Tp> &dst)
{
dst.clear();
dst.resize(4);
dst[0] = std::max(src1[0], src2[0]);
dst[1] = std::max(src1[1], src2[1]);
dst[2] = std::min(src1[0] + src1[2], src2[0] + src2[2]) - dst[0];
dst[3] = std::min(src1[1] + src1[3], src2[1] + src2[3]) - dst[1];
if (dst[2] <= 0 || dst[3] <= 0)
memset(dst.data(), (_Tp)0, sizeof(_Tp) * 4);
}
有了交集,自然容易计算并集 = 面积之和 - 交集
,
然后计算交并比IOU = 交集 / 并集
.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。