【问题标题】:Detect a Parallelogram from an Image using opencv and Numpy使用 opencv 和 Numpy 从图像中检测平行四边形
【发布时间】:2021-02-17 14:13:54
【问题描述】:

Parallelogram in Image

我想在 python 语言中使用 Opencv 和 numpy 检测图像中的平行四边形。我已经从轮廓检测中尝试过,并成功检测到矩形和正方形,但无法检测到平行四边形和菱形等形状,谁能帮我解决这个问题?

【问题讨论】:

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

标签: python python-3.x numpy opencv image-processing


【解决方案1】:

我会做的是:

  1. 检测轮廓
  2. 在轮廓上绘制直线(可能使用 approxyPolyDP)
  3. 计算每个角的角度
  4. 确保对角一致(在边距内)并且彼此相邻的角相加为 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))

我写了一些 cmets 来提供帮助。我没有对它进行广泛的测试,所以要小心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2017-06-14
    相关资源
    最近更新 更多