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;