Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在不知道宽度或高度的情况下对矩形的角进行最佳排序?_C++_Opencv_Math - Fatal编程技术网

C++ 如何在不知道宽度或高度的情况下对矩形的角进行最佳排序?

C++ 如何在不知道宽度或高度的情况下对矩形的角进行最佳排序?,c++,opencv,math,C++,Opencv,Math,我有一个矩形的四个坐标。我想找出哪些是左上角、右上角、左下角和右下角的点。 我自己编写的方法(不必要地)很长,实际上没有起作用(可能是因为我在某个地方犯了错误)。不管是哪种方式,我肯定有一种更简单的方法,但我找不到使用谷歌的方法。因此,任何帮助都将不胜感激 我的方法是用max y(最上面)、min y(最下面)、max x(最右边)、min x(最左边)查找角点。然后,如果最左边的.y>最右边的.y,那么左上角点是最左边的,右上角点是最上面的,等等。 这个方法正确吗?还有更简单的方法吗 我的代码

我有一个矩形的四个坐标。我想找出哪些是左上角、右上角、左下角和右下角的点。 我自己编写的方法(不必要地)很长,实际上没有起作用(可能是因为我在某个地方犯了错误)。不管是哪种方式,我肯定有一种更简单的方法,但我找不到使用谷歌的方法。因此,任何帮助都将不胜感激

我的方法是用max y(最上面)、min y(最下面)、max x(最右边)、min x(最左边)查找角点。然后,如果最左边的.y>最右边的.y,那么左上角点是最左边的,右上角点是最上面的,等等。 这个方法正确吗?还有更简单的方法吗

我的代码,很抱歉,很混乱。。。squareX[0]是第一个x坐标squareY[0]是第一个y坐标等

编辑:结果表明我的方法很好,它的just max()并不像我想象的那样(将输入的所有数字中的最大值都返回出来)


谢谢

按点的剩余距离排序。前两点是矩形的左侧。按高度对这两点进行排序。最高的是左上角点,另一个是左下角点。对右边的两个进行同样的操作。

这是一种尝试,使用尽可能少的比较:

if X0 == X1:
  # P0 and P1 are on a vertical
  if X0 < X2:
    # P0 and P1 are on the left
  else:
    # P2 and P3 are on the left
    swap P0-P2
    swap P1-P3
else:
  # P0 and P1 are on a diagonal
  if X0 < X1:
    # P0 is on the left
    if X0 < X2:
      # P0 and P3 are on the left
      swap P1-P3
    else:
      # P0 and P2 are on the left
      swap P1-P2
  else:
    # P1 is on the left
    if X1 < X2:
      # P1 and P3 are on the left
      swap P0-P3
    else:
      # P1 and P2 are on the left
      swap P0-P2
在Y上再进行两次比较(向下增加),矩形为0231,顺时针方向


在少于5个比较中,你不能这样做,因为你需要覆盖24个排列(2 ^ 4<p>),你可以使用标准的C++库,<代码> MyNyEngs< /C>和<代码> Max元素> /Cord>,使用自定义比较器。


我有一个简单的例子(抱歉,这不是纯opencv,但移植很简单)。

我最近遇到了类似的问题,让我分享一下我的方案:

  • 计算矩形的中心
  • 使用矩形的中心作为角点的新原点
  • 将角点转换为极坐标
  • 按角度对角进行排序

  • 矩形是否平行于轴es?您的方式似乎是最简单的,因此不清楚您要简化什么。因此,请添加您的代码。它可以是任意方向,但可能不平行于轴。首先,沿x方向的起点排序矩形,然后沿y方向排序。您将完成排序组。如果矩形可以是正方形,并且可以有任何方向,如果正方形正好位于尖端上,您如何定义左上角?使用字典顺序(在X上比较,如果是平局,则在Y上比较)将一次性执行这两个操作。
    if X0 == X1:
      # P0 and P1 are on a vertical
      if X0 < X2:
        # P0 and P1 are on the left
      else:
        # P2 and P3 are on the left
        swap P0-P2
        swap P1-P3
    else:
      # P0 and P1 are on a diagonal
      if X0 < X1:
        # P0 is on the left
        if X0 < X2:
          # P0 and P3 are on the left
          swap P1-P3
        else:
          # P0 and P2 are on the left
          swap P1-P2
      else:
        # P1 is on the left
        if X1 < X2:
          # P1 and P3 are on the left
          swap P0-P3
        else:
          # P1 and P2 are on the left
          swap P0-P2
    
    if Y0 > Y1:
      # P1 is upper
      swap P0-P1
    
    if Y2 > Y3:
      # P3 is upper
      swap P2-P3