Python 使用opencv和Numpy从图像中检测平行四边形

Python 使用opencv和Numpy从图像中检测平行四边形,python,python-3.x,numpy,opencv,image-processing,Python,Python 3.x,Numpy,Opencv,Image Processing,我想使用python语言中的Opencv和numpy检测图像中的平行四边形。我尝试过轮廓检测,成功检测出矩形和正方形,但无法检测平行四边形和菱形,有人能帮我吗???我想做的是: 检测轮廓 在等高线上绘制直线(可能使用approxyPolyDP) 计算每个角的角度 确保相对的角是一致的(在一个边距内),相邻的角加起来是180 我以前写过一些代码来计算向量的3个点之间的角度。这可能会有帮助 def angle(pt1, pt2, pt0): # For A(x,y), B(x,y), C(x,y)

我想使用python语言中的Opencv和numpy检测图像中的平行四边形。我尝试过轮廓检测,成功检测出矩形和正方形,但无法检测平行四边形和菱形,有人能帮我吗???

我想做的是:

  • 检测轮廓
  • 在等高线上绘制直线(可能使用approxyPolyDP)
  • 计算每个角的角度
  • 确保相对的角是一致的(在一个边距内),相邻的角加起来是180
  • 我以前写过一些代码来计算向量的3个点之间的角度。这可能会有帮助

    def angle(pt1, pt2, pt0):
    # For A(x,y), B(x,y), C(x,y)
    #  vectorAB = B-A = ((Bx-Ax)-(By-Ay))
    #  vectorBC = C-B = ((Cx-Bx)-(Cy-By))
    # dx1 = pt1x-coordinate - pt0x-coordinate
    dx1 = pt1[0][0] - pt0[0][0]
    dy1 = pt1[0][1] - pt0[0][1]
    # vectorAB
    d1 = np.array([dx1, dy1])
    
    # vectorBC
    dx2 = pt2[0][0] - pt0[0][0]
    dy2 = pt2[0][1]  - pt0[0][1]
    d2 = np.array([dx2, dy2])
    
    # dot product of d1 en d2
    # dotPrd1d2= d2(x)*d1(x)+d2(y)*d1(y)
    dotPr = np.dot(d1, d2)
    # ||AB|| = sqrt(math.pow(vectorABx, 2) + math.pow(VectorABy,2))
    # ||BC|| = sqrt(math.pow(vectorBCx, 2) + math.pow(vectorBCy,2))
    lengthOfd1 = math.sqrt(math.pow(dx1,2) + math.pow(dy1, 2))
    lengthOfd2 = math.sqrt(math.pow(dx2, 2) + math.pow(dy2, 2))
    # returns the angle of the vector by arc cos alpha
    return np.arccos(dotPr/(lengthOfd1*lengthOfd2))
    
    我写了一些评论来帮助你。我还没有全面测试过它,所以要小心。

    我要做的是:

  • 检测轮廓
  • 在等高线上绘制直线(可能使用approxyPolyDP)
  • 计算每个角的角度
  • 确保相对的角是一致的(在一个边距内),相邻的角加起来是180
  • 我以前写过一些代码来计算向量的3个点之间的角度。这可能会有帮助

    def angle(pt1, pt2, pt0):
    # For A(x,y), B(x,y), C(x,y)
    #  vectorAB = B-A = ((Bx-Ax)-(By-Ay))
    #  vectorBC = C-B = ((Cx-Bx)-(Cy-By))
    # dx1 = pt1x-coordinate - pt0x-coordinate
    dx1 = pt1[0][0] - pt0[0][0]
    dy1 = pt1[0][1] - pt0[0][1]
    # vectorAB
    d1 = np.array([dx1, dy1])
    
    # vectorBC
    dx2 = pt2[0][0] - pt0[0][0]
    dy2 = pt2[0][1]  - pt0[0][1]
    d2 = np.array([dx2, dy2])
    
    # dot product of d1 en d2
    # dotPrd1d2= d2(x)*d1(x)+d2(y)*d1(y)
    dotPr = np.dot(d1, d2)
    # ||AB|| = sqrt(math.pow(vectorABx, 2) + math.pow(VectorABy,2))
    # ||BC|| = sqrt(math.pow(vectorBCx, 2) + math.pow(vectorBCy,2))
    lengthOfd1 = math.sqrt(math.pow(dx1,2) + math.pow(dy1, 2))
    lengthOfd2 = math.sqrt(math.pow(dx2, 2) + math.pow(dy2, 2))
    # returns the angle of the vector by arc cos alpha
    return np.arccos(dotPr/(lengthOfd1*lengthOfd2))
    

    我写了一些评论来帮助你。我还没有对它进行全面测试,所以要小心。

    找到所有的四边形物体。然后看边的角度。如果相对的边是平行的,但两条相对边的角度不是90的倍数,那么就有一个平行四边形(前提是平行四边形没有从显示的角度旋转)。其定义是:“平行四边形是一种有四条边的形状,彼此相对的边平行且长度相等,这意味着它们不相交。平行四边形的示例包括正方形、菱形和矩形。圆、三角形和梯形不是平行四边形。”平行四边形有三种特殊类型。菱形:所有边相等的平行四边形。矩形:所有角度都是直角且对角线相等的平行四边形。正方形:所有等边和所有角度等于90度的平行四边形。正方形的对角线也是相等的。平行四边形是具有两组平行边和两组全等边的四边形。平行四边形的对角是全等的;其连续角度是补充的;它的对角线彼此对分,并且它的对角线形成两个全等三角形找到所有4边的对象。然后看边的角度。如果相对的边是平行的,但两条相对边的角度不是90的倍数,那么就有一个平行四边形(前提是平行四边形没有从显示的角度旋转)。其定义是:“平行四边形是一种有四条边的形状,彼此相对的边平行且长度相等,这意味着它们不相交。平行四边形的示例包括正方形、菱形和矩形。圆、三角形和梯形不是平行四边形。”平行四边形有三种特殊类型。菱形:所有边相等的平行四边形。矩形:所有角度都是直角且对角线相等的平行四边形。正方形:所有等边和所有角度等于90度的平行四边形。正方形的对角线也是相等的。平行四边形是具有两组平行边和两组全等边的四边形。平行四边形的对角是全等的;其连续角度是补充的;它的对角线彼此对分,并且它的对角线形成两个全等三角形