如何使用OpenCV和Python查找梯形的角,类似于查找正方形的角?

问题描述

我正在使用以下代码来查找图像中最大正方形的角。我想做同样的事情,但是如果正方形碰巧弯曲(像梯形),它仍然可以找到形状的角。如何使用Python的OpenCV模块执行此操作?

importedImage = 'shapes.png'
originalImg = cv.imread(importedImage)

#filters image bilaterally and displays it
bilatImg = cv.bilateralFilter(originalImg,5,175,175)

#finds edges of bilaterally filtered image and displays it
edgeImg = cv.Canny(bilatImg,75,200)

#gets contours (outlines) for shapes and sorts from largest area to smallest area
contours,hierarchy = cv.findContours(edgeImg,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
contours = sorted(contours,key=cv.contourArea,reverse=True)

#Boxes in largest rectangle
rectangle = cv.minAreaRect(contours[0])
corners = cv.BoxPoints(rectangle).astype(np.int32)

解决方法

Ciao

为了解决您的问题,您可以使用此代码段。我在新零件上留下了评论,以使其更易于理解

import cv2
import numpy as np

importedImage = 'shapes.png'
originalImg = cv2.imread(importedImage)

#filters image bilaterally and displays it
bilatImg = cv2.bilateralFilter(originalImg,5,175,175)

#finds edges of bilaterally filtered image and displays it
edgeImg = cv2.Canny(bilatImg,75,200)

#gets contours (outlines) for shapes and sorts from largest area to smallest area
contours,hierarchy = cv2.findContours(edgeImg,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours,key=cv2.contourArea,reverse=True)

# drawing red contours on the image
for con in contours:
    cv2.drawContours(originalImg,con,-1,(0,255),3)

# and double-checking the outcome
cv2.imshow("Contours check",originalImg)
cv2.waitKey()
cv2.destroyWindow("Contours check")

# find the perimeter of the first closed contour
perim = cv2.arcLength(contours[0],True)
# setting the precision
epsilon = 0.02*perim
# approximating the contour with a polygon
approxCorners = cv2.approxPolyDP(contours[0],epsilon,True)
# check how many vertices has the approximate polygon
approxCornersNumber = len(approxCorners)
print("Number of approximated corners: ",approxCornersNumber)

# can also be used to filter before moving on [if needed]
# i.e. if approxCornersNumber== 4:

# printing the position of the calculated corners
print("Coordinates of approximated corners:\n",approxCorners)

奖金:如果要检查哪个顶点,则可以简单地基于this answer附加最后一部分,其中(x,y)是上面为每个顶点提供的坐标

originalImg = cv2.circle(originalImg,(x,y),radius=10,color=(255,255,thickness=-1)
cv2.imshow("Vertex position",originalImg)
cv2.waitKey()
cv2.destroyWindow("Vertex position")

祝你有美好的一天,
安东尼诺