注意 LCD 的轮廓是如何清晰可见的——这完成了步骤 #1。 我们现在可以继续第 2 步,提取 LCD 本身:
find contours in the edge map, then sort them by their
size in descending order
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
displayCnt = None
loop over the contours
for c in cnts:
approximate the contour
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
if the contour has four vertices, then we have found
the thermostat display
if len(approx) == 4:
displayCnt = approx
break
为了找到 LCD 区域,我们需要提取边缘图中区域的轮廓(即轮廓)。
然后我们按面积对等高线进行排序,确保将面积较大的等高线放在列表的前面。
给定我们排序的轮廓列表,逐个循环它们并应用轮廓近似。
如果我们的近似轮廓有四个顶点,那么我们假设我们已经找到了恒温器显示。 这是一个合理的假设,因为我们输入图像中最大的矩形区域应该是 LCD 本身。
获得四个顶点后,我们可以通过四点透视变换提取 LCD:
extract the thermostat display, apply a perspective transform
to it
warped = four_point_transform(gray, displayCnt.reshape(4, 2))
output = four_point_transform(image, displayCnt.reshape(4, 2))
应用这种透视变换为我们提供了一个自上而下的 LCD 鸟瞰图:
获得 LCD 的这个视图满足第 2 步——我们现在准备从 LCD 中提取数字:
threshold the warped image, then apply a series of morphological
operations to cleanup the thresholded image
thresh = cv2.threshold(warped, 0, 255,