视觉/图像重磅干货,第一时间送达
导读
本文主要介绍一个计算器显示数字识别的OCR实例,基于OpenCV和EasyOCR/PaddleOCR。
实例来源
实例来源于51Halcon论坛,对应的Halcon实现这里不做介绍,如下图,最终目的就是识别计算器显示数字内容。
初步思路:先提取显示区域ROI,然后使用EasyOCR或PaddleOCR直接识别。
实现步骤与演示
【1】通过HSV阈值筛选,分离液晶显示区域;
【2】轮廓筛选,精确定位出液晶显示区域;
【3】截取ROI后传给EasyOCR识别
【4】实现完整源码与注意事项
# -*- 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,这样可以提高识别准确率!
ROI = img[y-20:y+h+20,x-20:x+w+20].copy()
ROI原始大小的识别结果:
ROI扩大后的识别结果:
2、截取ROI之后也可使用PaddleOCR方法识别,识别效果如下:
下载1:Pytoch常用函数手册
在「OpenCV与AI深度学习」公众号后台回复:Pytorch常用函数手册,即可下载全网第一份Pytorch常用函数手册,涵盖Tensors介绍、基础函数介绍、数据处理函数、优化函数、CUDA编程、多线程处理等十四章章内容。
下载2:145个OpenCV实例应用代码
在「OpenCV与AI深度学习」公众号后台回复:OpenCV145,即可下载145个OpenCV实例应用代码(Python和C++双语言实现)。
—THE END—