因应用要求,需要设计一个计算两个任意方位的矩形IOU的函数,查阅了很多资料,都没有找到。网上大多数代码都是只能实现与坐标轴平行的两个矩形的运算,所以自己写了一个(哎,没有免费的午餐,只能自己生产了,我也很绝望呀)。主要思想就是先算出两个矩阵边的交点,然后生成一个多边形,最后将多边形分割成三角形进行计算。代码详细如下:
1.简单的矩形定义类
#include <algorithm>
#include <csignal>#include <ctime>
#include <map>
#include <string>
#include <utility>
#include <vector>
#include <math.h>
#include <iostream>
#define Max(a,b) ((a>b)? a:b)
#define Min(a,b) ((a<b)? a:b)
#define Pi 3.1415926
class NormalizedBBox
{
public:
float x; //矩形中心坐标x
float y; //矩形中心坐标y
float w; //矩形宽
float h; //矩形高
float theta; //矩形倾角
NormalizedBBox(float x , float y , float w , float h , float theta );
};
2.矩形简单构造函数
#include "bbox_util.h"
NormalizedBBox::NormalizedBBox(float x, float y, float w, float h, float theta)
{
this->x = x;
this->y = y;
this->w = w;
this->h = h;
this->theta = theta;
}
3.主要用于计算的函数
//(1)根据两个矩形的8条边,计算交点。
void getBoxpoint(const vector< vector<float> > &temp_lines, vector< vector<float> >& temp_bbox1_point, vector< vector<float> >& temp_bbox2_point){
vector<float> point(2, 0);
point[0] = (temp_lines[0][1] - temp_lines[3][1]) / (temp_lines[3][0] - temp_lines[0][0]);
point[1] = temp_lines[0][0] * point[0] + temp_lines[0][1];
temp_bbox1_point.push_back(point);
for (int i = 0; i < 3; i++)
{
point[0] = (temp_lines[i][1] - temp_lines[(i + 1) % 4][1]) / (temp_lines[(i + 1) % 4][0] - temp_lines[i][0]);
point[1] = temp_lines[i][0] * point[0] + temp_lines[i][1];
temp_bbox1_point.push_back(point);
}
point[0] = (temp_lines[4][1] - temp_lines[7][1]) / (temp_lines[7][0] - temp_lines[4][0]);
point[1] = temp_lines[4][0] * point[0] + temp_lines[4][1];
temp_bbox2_point.push_back(point);
for (int i = 0; i < 3; i++)