在OpenCV中,CV_RETR_LIST、CV_RETR_TREE和CV_RETR_EXTERNAL是用于控制轮廓检测结果的检索模式参数。这些参数决定了如何检索和存储检测到的轮廓信息。下面将分别介绍这三种参数的区别,并附带相应的代码示例。
1. CV_RETR_LIST:CV_RETR_LIST是最简单的检索模式,它仅仅提取所有检测到的轮廓,而不建立任何父子关系或层次结构。这意味着返回的轮廓列表中的每个轮廓都是独立的,没有包含或排除其他轮廓。代码示例:pythonimport cv2img = cv2.imread('image.jpg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)_, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)contours, _ = cv2.findContours(threshold, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(img, contours, -1, (0, 255, 0), 2)cv2.imshow('Contours', img)cv2.waitKey(0)cv2.destroyAllWindows()2. CV_RETR_TREE:CV_RETR_TREE是一种建立轮廓层级结构的检索模式。它会将所有的轮廓按照层级关系进行组织和存储,每个轮廓都有一个父轮廓和可能的子轮廓。这种层级结构的组织方式可以通过轮廓的索引访问,从而进行更复杂的操作和分析。代码示例:
pythonimport cv2img = cv2.imread('image.jpg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)_, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)contours, hierarchy = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(img, contours, -1, (0, 255, 0), 2)cv2.imshow('Contours', img)cv2.waitKey(0)cv2.destroyAllWindows()3. CV_RETR_EXTERNAL:CV_RETR_EXTERNAL是一种只返回外部轮廓的检索模式。它会忽略所有的内部轮廓,只保留最外层的轮廓。这种模式适用于只需关心整个物体的外轮廓而不关心内部结构的情况。代码示例:
pythonimport cv2img = cv2.imread('image.jpg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)_, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(img, contours, -1, (0, 255, 0), 2)cv2.imshow('Contours', img)cv2.waitKey(0)cv2.destroyAllWindows()CV_RETR_LIST、CV_RETR_TREE和CV_RETR_EXTERNAL的区别CV_RETR_LIST、CV_RETR_TREE和CV_RETR_EXTERNAL这三个参数在轮廓检测中扮演着不同的角色。CV_RETR_LIST只返回所有检测到的独立轮廓,没有任何层级关系。CV_RETR_TREE会建立轮廓的层级结构,每个轮廓都有父轮廓和子轮廓。而CV_RETR_EXTERNAL只返回最外层的轮廓,忽略内部轮廓。通过选择适当的检索模式参数,我们可以根据实际需求来获取轮廓信息。如果只关心轮廓的形状而不关心层级关系,可以使用CV_RETR_LIST。如果需要分析轮廓的层级结构,可以使用CV_RETR_TREE。而如果只需要外部轮廓而不关心内部结构,可以使用CV_RETR_EXTERNAL。无论使用哪种检索模式,OpenCV的findContours函数都会返回一个包含检测到的轮廓信息的列表,以及可能的层级关系。我们可以根据这些信息进行后续的处理、分析或可视化操作。