我正在从事一个关于识别摩洛哥车牌的项目,看起来像这张图片:
摩洛哥车牌
请问我如何使用OpenCV来切割车牌,而Tesseract来读取中间的数字和阿拉伯字母。
我看了这篇研究论文:https://www.researchgate.net/publication/323808469_Moroccan_License_Plate_recognition_using_a_hybrid_method_and_license_plate_features
我已经在Windows 10中为python安装了OpenCV和Tesseract。当我使用< code >“fra”语言对车牌的纯文本部分运行tesseract时,我得到< code>7714315l Bv。我该如何分离数据?
编辑:我们在摩洛哥使用的阿拉伯字母是:أ ب ت ج ح د هـ预期的结果是:< code>77143 د 6竖线是不相关的,我必须使用它们来分隔图像并分别读取数据。
提前感谢!
这就是我现在取得的成就...
第二幅图像上的检测是使用这里找到的代码进行的:使用OpenCV和Python进行车牌检测
完整的代码(从第三张图片开始工作)是这样的:
import cv2
import numpy as np
import tesserocr as tr
from PIL import Image
image = cv2.imread("cropped.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', image)
thresh = cv2.adaptiveThreshold(gray, 250, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 255, 1)
cv2.imshow('thresh', thresh)
kernel = np.ones((1, 1), np.uint8)
img_dilation = cv2.dilate(thresh, kernel, iterations=1)
im2, ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])
clean_plate = 255 * np.ones_like(img_dilation)
for i, ctr in enumerate(sorted_ctrs):
x, y, w, h = cv2.boundingRect(ctr)
roi = img_dilation[y:y + h, x:x + w]
# these are very specific values made for this image only - it's not a factotum code
if h > 70 and w > 100:
rect = cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
clean_plate[y:y + h, x:x + w] = roi
cv2.imshow('ROI', rect)
cv2.imwrite('roi.png', roi)
img = cv2.imread("roi.png")
blur = cv2.medianBlur(img, 1)
cv2.imshow('4 - blur', blur)
pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
api = tr.PyTessBaseAPI()
try:
api.SetImage(pil_img)
boxes = api.GetComponentImages(tr.RIL.TEXTLINE, True)
text = api.GetUTF8Text()
finally:
api.End()
# clean the string a bit
text = str(text).strip()
plate = ""
# 77143-1916 ---> NNNNN|symbol|N
for char in text:
firstSection = text[:5]
# the arabic symbol is easy because it's nearly impossible for the OCR to misunderstood the last 2 digit
# so we have that the symbol is always the third char from the end (right to left)
symbol = text[-3]
lastChar = text[-1]
plate = firstSection + "[" + symbol + "]" + lastChar
print(plate)
cv2.waitKey(0)
对于阿拉伯符号,您应该从TesseractOCR安装其他语言(并可能使用它的版本4)。
输出:77143[9]6
括号之间的数字是阿拉伯符号(未检测到)。
希望我帮了你。
您可以使用 HoughTransform,因为这两条垂直线无关紧要,因此可以裁剪图像:
import numpy as np
import cv2
image = cv2.imread("lines.jpg")
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
dst = cv2.Canny(grayImage, 0, 150)
cv2.imwrite("canny.jpg", dst)
lines = cv2.HoughLinesP(dst, 1, np.pi / 180, 50, None, 60, 20)
lines_x = []
# Get height and width to constrain detected lines
height, width, channels = image.shape
for i in range(0, len(lines)):
l = lines[i][0]
# Check if the lines are vertical or not
angle = np.arctan2(l[3] - l[1], l[2] - l[0]) * 180.0 / np.pi
if (l[2] > width / 4) and (l[0] > width / 4) and (70 < angle < 100):
lines_x.append(l[2])
# To draw the detected lines
#cv2.line(image, (l[0], l[1]), (l[2], l[3]), (0, 0, 255), 3, cv2.LINE_AA)
#cv2.imwrite("lines_found.jpg", image)
# Sorting to get the line with the maximum x-coordinate for proper cropping
lines_x.sort(reverse=True)
crop_image = "cropped_lines"
for i in range(0, len(lines_x)):
if i == 0:
# Cropping to the end
img = image[0:height, lines_x[i]:width]
else:
# Cropping from the start
img = image[0:height, 0:lines_x[i]]
cv2.imwrite(crop_image + str(i) + ".jpg", img)
我相信你现在知道如何让中间部分;)希望它有帮助!
编辑:
使用一些形态操作,您还可以单独提取字符:
import numpy as np
import cv2
image = cv2.imread("lines.jpg")
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
dst = cv2.Canny(grayImage, 50, 100)
dst = cv2.morphologyEx(dst, cv2.MORPH_RECT, np.zeros((5,5), np.uint8),
iterations=1)
cv2.imwrite("canny.jpg", dst)
im2, contours, heirarchy = cv2.findContours(dst, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_NONE)
for i in range(0, len(contours)):
if cv2.contourArea(contours[i]) > 200:
x,y,w,h = cv2.boundingRect(contours[i])
# The w constrain to remove the vertical lines
if w > 10:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 1)
cv2.imwrite("contour.jpg", image)
结果:
我试图识别车牌,但遇到错误,如错误/未读取字符 下面是每个步骤的可视化: 从颜色阈值化变形关闭获得蒙版 以绿色突出显示的车牌轮廓过滤器 将板轮廓粘贴到空白遮罩上 Tesseract OCR的预期结果 BP 1309 GD 但我得到的结果是 BP 1309 6D 我尝试将轮廓切片为3切片 是的,它是有效的,但是如果我将差异图像插入到这个方法中,一些图像就无法识别,例如这个 字母N无法识别,但如果使用
我在Windows 10中使用Python 3.6,并且已经安装了Pytesseract,但我在代码Tessercr中找到了一个代码,顺便说一下,我无法安装。有什么区别?
我尝试了镶嵌,结果是:7G285274-AF现在我真的不知道该怎么办,如果有人知道请告诉我 首先,我从汽车图像中检测车牌,然后我必须从车牌中识别字符。这是我的代码:
目前,我正在Android应用程序中使用泰瑟拉克特 3 (armv7 这些是我目前为止尝试过的事情: compiling_on_terminal_or_androidStudio compiling_using_docker 这些方法的问题: issue_with_terminal_approach issue_with_docker_approach
1.1. cirtus_lpr_sdk 1.1.1. SDK接口说明 1.2. android_demo Rokid Plate Recognition SDK and demo project. Author Email cmxnono cmxnono@rokid.com 1.1. cirtus_lpr_sdk Version:1.0 1.1.1. SDK接口说明 初始化 public long
甚至这张照片上的镶嵌也无法识别任何字符。我的代码是: 我的问题是,你知道如何取得更好的结果吗?更清晰的图像?尽管我的车牌质量较差,因此结果可以读取OCR(例如泰瑟拉克特)。 谢谢你的回答。真的,我不知道怎么做。