如何在python opencv中通过里程表读数识别闭合矩形轮廓?

如何在python opencv中通过里程表读数识别闭合矩形轮廓?,python,opencv,image-processing,ocr,opencv-contour,Python,Opencv,Image Processing,Ocr,Opencv Contour,我试图使用cv2识别里程表读数-我试图提取里程表读数所在的轮廓。我无法准确地识别该地区。我试图从图像中获得面积/矩形轮廓。该代码表示区域的最大面积。有人能帮我吗 下面是代码 import numpy as np import matplotlib.pyplot as plt # assuming you have the result image store in median median = cv2.imread("odo_2.jpg", 0) image_gray = median

我试图使用
cv2
识别里程表读数-我试图提取里程表读数所在的轮廓。我无法准确地识别该地区。我试图从图像中获得面积/矩形轮廓。该代码表示区域的最大面积。有人能帮我吗

下面是代码

import numpy as np
import matplotlib.pyplot as plt 

# assuming you have the result image store in median
median = cv2.imread("odo_2.jpg", 0)
image_gray = median

binary = cv2.bitwise_not(image_gray)
edged = cv2.Canny(binary, 50, 80, 255)

#threshold = cv2.adaptiveThreshold(edged,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)



contours = cv2.findContours(edged, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2]



rect_cnts = []
for cnt in contours:
    peri = cv2.arcLength(cnt, True)
    approx = cv2.approxPolyDP(cnt, 0.04 * peri, True)
    (x, y, w, h) = cv2.boundingRect(cnt)
    ar = w / float(h)
    if (len(approx) == 4) & (ar >= 0.95 and ar <= 1.05) : # shape filtering condition
        pass 
    else :
        rect_cnts.append(cnt)


max_area = 0
football_square = None
for cnt in rect_cnts:
    (x, y, w, h) = cv2.boundingRect(cnt)
    if max_area < w*h:
        max_area = w*h
        football_square = cnt

# Draw the result
image = cv2.cvtColor(image_gray, cv2.COLOR_GRAY2RGB)
cv2.drawContours(image, [football_square], -1, (0, 0,255), 3)
cv2.imshow("Result Preview", image)
#cv2.imshow("Result Preview", edged)
cv2.waitKey(0)

将numpy导入为np
将matplotlib.pyplot作为plt导入
#假设结果图像存储在中间值中
中位数=cv2.imread(“odo_2.jpg”,0)
图像灰度=中值
二进制=cv2。按位\u非(图像\u灰色)
边缘=cv2.Canny(二进制,50,80,255)
#阈值=cv2.自适应阈值(边缘,255,cv2.自适应阈值,高斯,cv2.阈值二进制,11,2)
等高线=cv2.findContours(带边,cv2.RETR_树,cv2.CHAIN_近似值_简单)[-2]
rect_cnts=[]
对于轮廓中的cnt:
peri=cv2.弧长(cnt,真)
近似值=cv2.近似聚合度(cnt,0.04*peri,真)
(x,y,w,h)=cv2.boundingRect(cnt)
ar=w/浮子(h)

如果(len(近似)=4)和(ar>=0.95且ar您是否需要这些值,或者是您想要学习图像处理的东西?如果是第一种情况,我的建议是您尝试不同的方法

  • 可能有一个很小的可能性,你可以进入微控制器控制液晶显示器。可能有一些插头的情况下,或一些引脚的电路板上。也许你可以使用I2C或SPI获得的价值

  • 如果你必须将模拟仪器数字化,而你又无法侵入控制LCD的芯片,那么你就建立了一个非常“受控的环境”来读取图像。 在您的情况下,这意味着在里程表周围建立一个暗箱,并使用LCD的背光作为唯一光源。因此没有反射等。然后将摄像头固定在箱子上,确保获得清晰的图像。在该图像中,使用固定区域抓取LCD,并将其输入OCR算法。有一些OCR像一个魔咒一样工作那是LCD字体

  • 结果:

    import cv2 as cv
    low_H = 8
    low_S = 106
    low_V = 156
    high_H = 25
    high_S = 231
    high_V = 237
    frame = cv.imread('J.jpg')
    frame_HSV = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    frame_threshold = cv.inRange(frame_HSV, (low_H, low_S, low_V), (high_H, high_S, high_V))
    cv.imwrite('out_odo.png', frame_threshold)