cv::Rect类的构造

在算交并比的时候涉及到cv::Rect2f的初始化, 比较常用的由下面几种

    Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);	// 左上点xy,宽度,长度
    Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz); // 左上点point, size类(宽度, 长度)
    Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2); // 左上点point, 右下点point

当然也可以先创建一个空Rect然后对其的一些参数进行赋值

Rect.x		//左上点x
Rect.y		//左上点y
Rect.height	//长度
Rect.width	// 宽度

还有比较坑的是 Rect1 & Rect2确实是取出两个矩形的交集,但是Rect1 | Rect2并非传统意义上的并集,而是能够包裹两个矩形的最小外接矩形。
可以从下面直观看出

对应代码如下

int main()
{
    Mat paint(Size(640, 640), CV_8UC3, Scalar(255, 255, 255));
    Rect2i box1(Point2i(200, 200), Point2i(400, 400));
    Rect2i box2(Point2i(300, 300), Point(500, 500));
    auto Intersection = box1 & box2;
    auto Union = box1 | box2;
    rectangle(paint, box1, Scalar(0, 0, 0), 6);
    rectangle(paint, box2, Scalar(0, 0, 0), 6);
    rectangle(paint, Intersection, Scalar(255, 0, 0), -1); // Blue
    rectangle(paint, Union, Scalar(0, 0, 255), 2);         // Red
    imshow("show", paint);
    waitKey(0);
    return 0;
}

这里有个小技巧,将rectangle 的thickness参数设为-1即可进行填充矩形的操作

因此算并集的时候还是这样算吧

 float Union = box1.area() + box2.area() - Intersection;
posted @ 2024-06-09 23:03  凪风sama  阅读(21)  评论(0编辑  收藏  举报