当前位置:   article > 正文

C++ 计算IOU | 计算两个矩形的交集区域 - array, vector, cv::Mat_cv:rect 检测iou

cv:rect 检测iou
  • 如果你的项目方便使用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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 如果不能使用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);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

有了交集,自然容易计算并集 = 面积之和 - 交集
然后计算交并比IOU = 交集 / 并集.

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号