计算机视觉开源库OpenCV绘制轮廓,并将轮廓排序~示例效果如下:
原图:
示例代码如下:
#!/usr/bin/env python3
import cv2
def sort_contours(cnts, method="left-to-right"):
reverse = False
i = 0
if method == "right-to-left" or method == "bottom-to-top":
reverse = True
if method == "top-to-bottom" or method == "bottom-to-top":
i = 1
boundingBoxes = [cv2.boundingRect(c) for c in cnts]
(cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),
key=lambda b:b[1][i], reverse=reverse))
return (cnts, boundingBoxes)
def draw_contour(image, c, i):
M = cv2.moments(c)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
cv2.putText(image, "#{}#".format(i + 1), (cX-35, cY+10), cv2.FONT_HERSHEY_SIMPLEX,
1.0, (0, 255, 0), 2)
return image
image = cv2.imread("cntdemo.jpg")
cv2.imshow("Input Image", image)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, binimg = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
_, contours, _ = cv2.findContours(binimg, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=cv2.contourArea, reverse=False)[:3]
cv2.drawContours(image, contours, -1, (0, 0, 255), 2)
(contours, boundingBoxes) = sort_contours(contours, method="left-to-right")
for (i, c) in enumerate(contours):
draw_contour(image, c, i)
cv2.imshow("Result Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()