找到对象的几何中心并旋转它以最大化边界框高度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找到对象的几何中心并旋转它以最大化边界框高度相关的知识,希望对你有一定的参考价值。

这是一个很难回答的问题,我做了一些思考但没有取得多大成功。我的主要目标是旋转任意像素对象以最小化它的边界框宽度。 (或者为了最大化高度,假设周长不变则应该相同)

因为这个目标不在SO问题的范围内,所以我确定了一个更简单的目标,它将导致解决方案:找到像素对象的几何中心。

为什么?因为如果我有这个中心,我将能够找到离它最远的点,然后旋转对象,使这些点垂直对齐。

我原本以为这就像计算边界框的中心一样简单。 Inkscape中的快速测试证明了错误:边界框的中心不是旋转不变的:

enter image description here

那么,我怎样才能找到真实的几何中心来计算物体极值并旋转它?以下是我想要实现的一些插图 - 请注意我正在使用PIXELS而不是矢量数据:

enter image description here

答案

谷歌如何计算质量中心,但我宁愿直接接近你的主要目标:

  1. 计算OBB(定向边界框) 有更多的方法。有些人正在使用PCA或Eigen Vectors我这样做: How to Compute OBB of Multiple Curves? 这可以应用于矢量和光栅输入。
  2. 旋转,使OBB主轴与垂直轴对齐 所以你可以直接从OBB计算angle,只需在较大的OBB侧向量上使用atan2。并通过90-angle CCW旋转(如果你的坐标系是x+向右,y+上升,angle从CCW方向的x+轴增加)。
另一答案

cv2.minAreaRect可能就是你要找的东西。有关使用它的示例,请参阅here

另一答案

为了找到宽度最小的边界框,我建议采取以下步骤:

步骤1:对于所有角度,通过其凸包替换对象,因为它们具有相同的边界框。

关于盒子的观察:在最小宽度的盒子中,左侧或右侧垂直盒子线必须与船体的一个线段对齐 - 否则,通过旋转几度,您将得到一个较小宽度的盒子。这样就限制了凸包线段的方向。

步骤2:对于所有这些方向,计算船体所有点的最小和最大旋转x值,给出宽度。

另一答案

Ralf Kleberhoff的答案几乎是正确的,但它需要扭曲。

算法:

  1. 计算你的形状的凸包。
  2. 求出凸包的最大直径,即彼此相距最大距离的一对凸壳顶点,以及连接它们的段。
  3. 您想要的中心是最大直径的中点。
  4. 围绕该中心的旋转将最大直径带到垂直方向,这必然是产生最高(最大高度)边界框的那个。请注意,这不一定是具有最薄(最小宽度)边界框的配置,因为这两个条件不相等。

证明:中心是凸包最大直径中点的圆是包含整个物体的最小面积的圆。矛盾的是,如果存在较小的圆,则其直径的长度将小于最大直径,这意味着最大直径的极值中的至少一个将在这样的圆之外。

以上是关于找到对象的几何中心并旋转它以最大化边界框高度的主要内容,如果未能解决你的问题,请参考以下文章

从旋转的矩形计算边界框坐标

OBB(定向边界框)算法中的点?

根据对象边界框裁剪旋转图像 - Matlab

如何在平移/旋转后重新计算轴对齐的边界框

围绕其中心点旋转自定义几何网格

第24天 blender知识点-变换轴心点