定向角定义的定向边界框

时间:2015-07-13 14:28:19

标签: c++ matlab geometry

我知道如何使用Matlab中的regionprops()和使用OpenCV的boundingRect()找到最小边界框。如何在给定角度的情况下找到一个边界框(不是最小边界框)?例如,在下面的图像中,线是矩形的主轴。 enter image description here

2 个答案:

答案 0 :(得分:1)

嗯,有很多可能的解决方案。我会提到其中三个:

  1. 旋转所有点,使红线与x(或y)轴平行;然后,找到转换点的最小轴定向边界框;然后,向后旋转框以找到所需的框。

  2. 找到红线上和蓝线上的每个点的投影(垂直于红线),每个坐标存储最小值和最大值。

  3. 找到红线所有点的距离;然后,考虑到你应该很容易找到两个盒子的坐标;然后你可以重复计算,取一条垂直于红色的线,找到盒子里缺少的两个坐标

答案 1 :(得分:1)

您可以变换点,使轴与x轴或y轴匹配。找到变换点的边界框,并通过逆变换将边界框转换回原始空间 转型细节: https://en.wikipedia.org/wiki/Rotation_(mathematics) 你可以找到像这样的转换点的边界框。

double xmin = 1e+37,ymin = 1e+37;
double xmax = -1e+37,ymax = -1e+37;
for(size_t i = 0; i < numPoints; ++i)
{
  if( x[i] >= xmin ) xmin = x[i];
  if( y[i] >= ymin ) ymin = y[i];
  if( x[i] <= xmax ) xmax = x[i];
  if( y[i] <= ymax ) ymax = y[i];
}

您可以使用任何大号替换1e + 37或使用BIG FLOAT

有关Stefan Gottschalk想法的定向边界框实现的更多细节也可以在此博客上找到Oriented bounding box