繁体   English   中英

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

[英]Detect a Parallelogram from an Image using opencv and Numpy

图像中的平行四边形

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

我会做的是:

  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))

我写了一些评论来提供帮助。 我还没有广泛测试它,所以要小心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM