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

Javascript 找到对象的几何中心并旋转它以最大化边界框高度,javascript,algorithm,image-processing,computer-vision,bounding-box,Javascript,Algorithm,Image Processing,Computer Vision,Bounding Box,这是一个很难回答的问题,我做了一些思考,但没有取得多大成功我的主要目标是旋转任意像素对象,以最小化其边界框的宽度。(或者最大化高度,假设周长不变,则高度应相同) 因为这样的目标不在SO问题的范围内,所以我确定了一个更简单的目标来解决这个问题:找到像素对象的几何中心 为什么??因为如果我有这个中心,我将能够找到离它最远的点,然后旋转对象,使这些点垂直对齐 我原本以为这会像计算边界框的中心一样简单。Inkscape中的快速测试证明错误:边界框的中心不是旋转不变的: 那么,我怎样才能找到真正的几何中

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

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

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

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

那么,我怎样才能找到真正的几何中心来计算物体的极限并旋转它呢?以下是我试图实现的一些示例-请注意,我使用的是像素而不是矢量数据:


谷歌如何计算重心,但我更愿意直接接近你的主要目标:

  • 计算OBB(定向边界框)

    这方面有更多的方法。有些人使用PCA或特征向量,我正在这样做:

    可应用于矢量和光栅输入

  • 旋转,使OBB主轴与垂直轴对齐

    因此,您可以直接从OBB计算
    角度,只需在较大的OBB侧向量上使用
    atan2
    。然后以
    90角度
    CCW旋转(如果坐标系是
    x+
    向右,
    y+
    向上,并且
    角度从
    x+
    轴向CCW方向增加)


  • 要查找宽度最小的边界框,我建议执行以下步骤:

    步骤1:将对象替换为其凸面外壳,因为它们具有相同的边界框,适用于所有角度

    关于长方体的观察:在最小宽度的长方体中,左侧或右侧垂直长方体线必须与船体的一个线段对齐-否则,通过旋转几度可以获得较小的宽度。因此,将方向限制为凸面外壳线的线段


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

    Ralf Kleberhoff的答案几乎正确,但需要扭转

    算法:

  • 计算形状的凸面外壳
  • 求凸包的最大直径,即彼此距离最大的凸包顶点对,以及连接它们的线段
  • 所需的中心是最大直径的中点
  • 将最大直径带到垂直方向的围绕该中心的旋转必然会产生最高(最大高度)的边界框。请注意,这不一定是具有最薄(最小宽度)边界框的配置,因为这两个条件并不等效
    证明:圆心为凸包最大直径中点的圆是包围整个物体的面积最小的圆。矛盾的是,如果存在一个较小的圆,其直径的长度将小于最大直径,这意味着最大直径的至少一个极值将位于该圆之外。

    cv2。Minarealect可能正是您要寻找的。查看使用它的示例。

    是的,我在谷歌上的研究得出了类似的结论。我仍然希望在不实施所有这些的情况下可能会有一个技巧。@TomášZato顺便说一句,质心和最远点的方法不一定能显示最佳角度位置(以前确实走过这条路径)。例如,以简单矩形为例,对于最小宽度BBOX,角不与Y轴对齐。并且角度差不能从角点位置推断出来……最小化边界框的宽度并不等于最大化其高度。例如,您的“坏矩形”示例接近最大高度(正好是上下角垂直对齐),但肯定没有最小宽度。@RalfKleberhoff好吧,所有这些想法和我的想法都是错误的…:)也许,如果你描述了你真正的问题,你就会找到解决办法。b盒宽度的最小化、b盒高度的最大化、中心的选择都是不同的问题(最后一个问题本身就是一组不同的问题)。看起来你原来的问题不是这些…@maxim1000好吧,问题末尾的图片描述了实际的问题:我有一些高大物体的图片,但它们是倾斜的,我想把它们放直。我可以检测到这些物体并从照片中提取它们,但我无法计算热来旋转它们,使它们笔直。@TomášZato,我应该怎么做?