在 Python 中使用层次结构进行 findContours
Posted
技术标签:
【中文标题】在 Python 中使用层次结构进行 findContours【英文标题】:in Python use of hierarchy for findContours 【发布时间】:2014-05-16 17:30:29 【问题描述】:我实现了一个 Python 脚本来识别手绘图中的形状。但是,该脚本识别的形状比需要的多。
这是一个示例图片:
这是脚本的输出:
我写的部分代码如下:
def create_graph(vertex, color):
for g in range(0, len(vertex)-1):
for y in range(0, len(vertex[0][0])-1):
cv2.circle(newimg, (vertex[g][0][y], vertex[g][0][y+1]), 3, (255,255,255), -1)
cv2.line(newimg, (vertex[g][0][y], vertex[g][0][y+1]), (vertex[g+1][0][y], vertex[g+1][0][y+1]), color, 2)
cv2.line(newimg, (vertex[len(vertex)-1][0][0], vertex[len(vertex)-1][0][1]), (vertex[0][0][0], vertex[0][0][1]), color, 2)
img = cv2.imread('star.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Remove of noise, if any
kernel = np.ones((2, 2),np.uint8)
erosion = cv2.erode(gray, kernel, iterations = 1)
#Create a new image of the same size of the starting image
height, width = gray.shape
newimg = np.zeros((height, width, 3), np.uint8)
#Canny edge detector
thresh = 175
edges = cv2.Canny(erosion, thresh, thresh*2)
contours,hierarchy = cv2.findContours(edges, cv2.cv.CV_RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
for b,cnt in enumerate(contours):
if hierarchy[0,b,3] == -1: #<-the mistake might be here
approx = cv2.approxPolyDP(cnt,0.015*cv2.arcLength(cnt,True), True)
clr = (255, 0, 0)
create_graph(approx, clr) #function for drawing the found contours in the new img
cv2.imwrite('starg.jpg', newimg)
我没有发布所有代码,因为没用。我认为我误认为使用层次结构来查找轮廓。我不是这样的 Python 专家,我不太了解轮廓中层次结构的使用。有人有建议吗?
【问题讨论】:
【参考方案1】:更改 findContours 的标志,以便只检索外部轮廓。使用RETR_EXTERNAL
标志,如下例所示:
contours,hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
这应该可以解决问题。
【讨论】:
以上是关于在 Python 中使用层次结构进行 findContours的主要内容,如果未能解决你的问题,请参考以下文章
如何在不添加目录层次结构的情况下使用 Python 将文件添加到 tarfile?
如何使用python脚本从网站中废弃数据并以层次结构存储在文件夹中?