实战 | 计算器/数码管OCR数字识别(附源码)

2021-12-10 09:01:26 浏览数 (1)

导读

本文主要介绍一个计算器显示数字识别的OCR实例,基于OpenCV和EasyOCR/PaddleOCR。

实例来源

实例来源于51Halcon论坛,对应的Halcon实现这里不做介绍,如下图,最终目的就是识别计算器显示数字内容。

初步思路:先提取显示区域ROI,然后使用EasyOCR或PaddleOCR直接识别。

实现步骤与演示

【1】通过HSV阈值筛选,分离液晶显示区域;

【2】轮廓筛选,精确定位出液晶显示区域;

【3】截取ROI后传给EasyOCR识别

【4】实现完整源码与注意事项

代码语言:javascript复制
# -*- coding: cp936 -*-
import numpy as np
import cv2
import easyocr

font = cv2.FONT_HERSHEY_SIMPLEX
reader = easyocr.Reader(['en'])

img=cv2.imread("test.jpg")
hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

lower_hsv = np.array([0,0,30])#颜色范围低阈值
upper_hsv = np.array([170,100,210])#颜色范围高阈值

mask = cv2.inRange(hsv_img,lower_hsv,upper_hsv)#根据颜色范围删选
mask = cv2.medianBlur(mask, 5)#中值滤波
cv2.imshow('mask', mask)

contours,hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
ROI = None
rect = (0,0,0,0)
for cnt in contours:
  (x, y, w, h) = cv2.boundingRect(cnt)
  if(w > 240 and w < 300 and h>60 and h < 100):
    ROI = img[y-20:y h 20,x-20:x w 20].copy()
    cv2.rectangle(img,(x,y),(x w,y h),(0,255,0),3)
    rect = (x, y, w, h)
    break
cv2.imshow('e',img)
cv2.imshow('ROI',ROI)
cv2.imwrite('roi.jpg',ROI)

result = reader.readtext(ROI)
if len(result) > 0:
  for i in range(0,len(result)):
    print(result[i][1])
    strText = result[i][1].replace(' ','')
    cv2.putText(img,strText,(rect[0],rect[1]),0,1.5,(0,0,255),3)
    
cv2.imshow('result',img)
cv2.imwrite('res.jpg',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意事项:

1、截取ROI时并没有按照ROI原始大小截取,而是将ROI四周扩大20pixel,这样可以提高识别准确率!

代码语言:javascript复制
ROI = img[y-20:y h 20,x-20:x w 20].copy()

ROI原始大小的识别结果:

ROI扩大后的识别结果:

2、截取ROI之后也可使用PaddleOCR方法识别,识别效果如下:

0 人点赞