D.现在是,学术时间 (II)
题意
1.给出一个由平面上两点\((0,0),(x,y)\)所确定的GT目标框和一个点\(P(x_p,y_p)\)。请你求出在所有以P点作为其中一个顶点且边都平行于坐标轴的预测目标框中,可以使其与GT目标框取到的最大IOU为多少。
- 标检测任务旨在编写一个程序检测出图中存在的各种目标,每个目标可以用一个四边都平行于图像边界的矩形框来描述,我们称为目标框。而图像上完全正确的框出了目标的目标框称为GT目标框,程序所输出的目标框称为预测目标框。
- 为了评价程序的精确度,常常使用IOU这一标准来判断。定义两个矩形A,BA,B的IOU为两个矩形交集部分的面积除以两个矩形并集部分的面积。
思路
- 另一个矩形顶点一定是ABCD之一;
- 考虑P点坐标的四种情况,即右图四个区域
- 区域1:枚举A、B、C、D作为另一顶点的四种情况,取最大IOU;(易证)
- 区域3:取A作为另一顶点; (不易证)
- 区域2:枚举A、B作为另一顶点的两种情况,选较大的IOU; (易证)
- 区域4:枚举A、D作为另一顶点的两种情况,选较大的IOU; (易证)
代码
点击查看代码
#include<iostream>
#include<iomanip>
using namespace std;
#define prep(i,a,b) for(int i = (a); i <= (b); i ++)
#define rrep(i,a,b) for(int i = (a); i >= (b); i --)
typedef long long LL;
const char nl = '\n';
int T, n, m;
int x,y,xp,yp;
void solve() {
cin >> x >> y >> xp >> yp;
if(xp <= x && yp <= y)cout << fixed << setprecision(9) << 1.0 * max(y - yp,yp) * max(x - xp,xp) / (x * y) << nl;
else if(yp > y && xp <= x)cout << fixed << setprecision(9) << 1.0 * y * max(x - xp,xp) / (x * y + (yp - y) * max(x - xp,xp))<< nl;
else if(xp > x && yp <= y)cout << fixed << setprecision(9) << 1.0 * x * max(y - yp,yp) / (x * y + (xp - x) * max(y - yp,yp))<< nl;
else cout << fixed << setprecision(9) << 1.0 * x * y / (xp * yp) << nl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> T;
while (T--) {
solve();
}
return 0;
}