如何正确读取EasyOr的文本?
我正在尝试从相机模块中读取图像,到目前为止,我必须使用自适应过滤来以这种方式处理图像。此外,我做了很多操纵来裁剪ROI并阅读文本。但是,它正在读取数字,但没有读数数字旁边的单位,这些数字的大小相对较小。如何解决这个问题?
import easyocr
import cv2
import numpy as np
import matplotlib.pyplot as plt
import time
import urllib.request
url = 'http://192.168.137.108/cam-hi.jpg'
while True:
img_resp=urllib.request.urlopen(url)
imgnp=np.array(bytearray(img_resp.read()),dtype=np.uint8)
image = cv2.imdecode(imgnp,-1)
image = cv2.medianBlur(image,7)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #to gray convert
th3 = cv2.adaptiveThreshold(gray_image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2) #adaptive threshold gaussian filter used
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(th3, cv2.MORPH_OPEN, kernel)
x = 0 #to save the position, width and height for contours(later used)
y = 0
w = 0
h = 0
cnts = cv2.findContours(opening, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
threshold = 10
font = cv2.FONT_HERSHEY_SIMPLEX
org = (50, 50)
fontScale = 1
color = (0, 0, 0)
thickness = 2
for c in cnts:
approx = cv2.approxPolyDP(c,0.01*cv2.arcLength(c,True),True)
area = cv2.contourArea(c)
if len(approx) == 4 and area > 100000: #manual area value used to find ROI for rectangular contours
cv2.drawContours(image,[c], 0, (0,255,0), 3)
n = approx.ravel()
font = cv2.FONT_HERSHEY_SIMPLEX
(x, y, w, h) = cv2.boundingRect(c)
old_img = opening[y:y+h, x:x+w] #selecting the ROI
width, height = old_img.shape
cropped_img = old_img[50:int(width/2), 0:height] #cropping half of the frame of ROI to just focus on the number
new = reader.readtext(cropped_img) #reading text using easyocr
if(new == []):
text = 'none'
else:
text = new
print(text)
# cv2.rectangle(cropped_img, tuple(text[0][0][0]), tuple(text[0][0][2]), (0, 0, 0), 2)
if(text[0][2] > 0.5): #checking the confidence level
cv2.putText(cropped_img, text[0][1], org, font, fontScale, color, thickness, cv2.LINE_AA)
cv2.imshow('frame1',cropped_img)
key = cv2.waitKey(5)
if key == 27:
break
cv2.waitKey(0)
cv2.destroyAllWindows()
I am trying to read images from a camera module and so far I got to process the image this way using adaptive filtering. Besides, I did a lot of manipulation to crop the ROI and read the text. However, it is reading the number but not the units beside the numbers, which are comparatively small in size. How do I solve this problem?
import easyocr
import cv2
import numpy as np
import matplotlib.pyplot as plt
import time
import urllib.request
url = 'http://192.168.137.108/cam-hi.jpg'
while True:
img_resp=urllib.request.urlopen(url)
imgnp=np.array(bytearray(img_resp.read()),dtype=np.uint8)
image = cv2.imdecode(imgnp,-1)
image = cv2.medianBlur(image,7)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #to gray convert
th3 = cv2.adaptiveThreshold(gray_image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2) #adaptive threshold gaussian filter used
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(th3, cv2.MORPH_OPEN, kernel)
x = 0 #to save the position, width and height for contours(later used)
y = 0
w = 0
h = 0
cnts = cv2.findContours(opening, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
threshold = 10
font = cv2.FONT_HERSHEY_SIMPLEX
org = (50, 50)
fontScale = 1
color = (0, 0, 0)
thickness = 2
for c in cnts:
approx = cv2.approxPolyDP(c,0.01*cv2.arcLength(c,True),True)
area = cv2.contourArea(c)
if len(approx) == 4 and area > 100000: #manual area value used to find ROI for rectangular contours
cv2.drawContours(image,[c], 0, (0,255,0), 3)
n = approx.ravel()
font = cv2.FONT_HERSHEY_SIMPLEX
(x, y, w, h) = cv2.boundingRect(c)
old_img = opening[y:y+h, x:x+w] #selecting the ROI
width, height = old_img.shape
cropped_img = old_img[50:int(width/2), 0:height] #cropping half of the frame of ROI to just focus on the number
new = reader.readtext(cropped_img) #reading text using easyocr
if(new == []):
text = 'none'
else:
text = new
print(text)
# cv2.rectangle(cropped_img, tuple(text[0][0][0]), tuple(text[0][0][2]), (0, 0, 0), 2)
if(text[0][2] > 0.5): #checking the confidence level
cv2.putText(cropped_img, text[0][1], org, font, fontScale, color, thickness, cv2.LINE_AA)
cv2.imshow('frame1',cropped_img)
key = cv2.waitKey(5)
if key == 27:
break
cv2.waitKey(0)
cv2.destroyAllWindows()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是我能得到的最好的。希腊符号' mu '被确定为' p '。我还尝试搜索与
easyocr
相关的希腊语言模型,但找不到任何。这是我所做的:
我得到了以下内容:
将此图像作为输入传递给
easyocr
:This is the best I could get. The Greek symbol 'mu' is identified as 'p'. I also tried searching for Greek language model related to
easyocr
but could not find any.Here is what I did:
I got the following:
Passed this image as input to
easyocr
:如果您尝试清除图像并将路径传递到下面的方法,则可以尝试
If you try to clear the image and pass path to below method it work try