OpenCV实例(八)车牌字符识别技术(三)汉字识别

这篇具有很好参考价值的文章主要介绍了OpenCV实例(八)车牌字符识别技术(三)汉字识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相较于数字和英文字符的识别,汽车牌照中的汉字字符识别的难度更大,主要原因有以下4个方面:

(1)字符笔画因切分误差导致非笔画或笔画流失。

(2)汽车牌照被污染导致字符上出现污垢。

(3)采集所得车辆图像分辨率低导致多笔画的汉字较难分辨。

(4)车辆图像采集时所受光照影响的差异导致笔画较淡。

综合汉字识别时的这些难点来看,很难被直接提取的是字符的局部特征。笔画作为最重要的特征而仅存在于汉字中,这由先验知识可知。一旦捺、横、竖、撇这些笔画特征被提取到,对于汉字字符识别的工作就完成了许多。在水平方向上,横笔画的灰度值的波动表现为低频,竖笔画的灰度变化表现为低频;在垂直方向上,横笔画的灰度变化表现为高频,竖笔画的灰度变化表现为高频。在汉字字符特征的提取过程中,对于小波的多分辨率特性的利用显然是一个不错的选择。

对于汉字进识别的相关工作,在一系列对图像进行预处理以及对图像的特征进行提取等相关操作后就可以进行了。第一步是预处理原始图像;第二步是对字符的原始特征进行提取(主要通过小波变换进行),并降维处理原始特征(主要采用线性判别式分析(LDA)变换矩阵进行),获取字符的最终特征;第三步是在特征模板匹配和最小距离分类器中读入获取所得到的最终特征,得到字符的最终识别结果。

1.代码实例

中文车牌的识别(包括新能源汽车)

import cv2 as cv
from PIL import Image
import pytesseract as tess


def recoginse_text(image):
    """
    步骤:
    1、灰度,二值化处理
    2、形态学操作去噪
    3、识别
    :param image:
    :return:
    """

    # 灰度 二值化
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    # 如果是白底黑字 建议 _INV
    ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV| cv.THRESH_OTSU)


    # 形态学操作 (根据需要设置参数(1,2))
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,2))  #去除横向细线
    morph1 = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (2, 1)) #去除纵向细线
    morph2 = cv.morphologyEx(morph1,cv.MORPH_OPEN,kernel)
    cv.imshow("Morph",morph2)

    # 黑底白字取非,变为白底黑字(便于pytesseract 识别)
    cv.bitwise_not(morph2,morph2)
    textImage = Image.fromarray(morph2)

    # 图片转文字
    text=tess.image_to_string(textImage)
    n=10 #根据不同国家车牌固定数目进行设置
    print("识别结果:")
    print(text[1:n])
   


def main():
    # 读取需要识别的数字字母图片,并显示读到的原图
    src = cv.imread("cp.jpg")
    cv.imshow("src",src)

    # 识别
    recoginse_text(src)

    cv.waitKey(0)
    cv.destroyAllWindows()

if __name__=="__main__":
    main()





2.遇到问题

OpenCV实例(八)车牌字符识别技术(三)汉字识别,OpenCV,opencv,人工智能,计算机视觉

No module named ‘pytesseract’

缺少pytesseract 模块。

在环境中安装该模块

OpenCV实例(八)车牌字符识别技术(三)汉字识别,OpenCV,opencv,人工智能,计算机视觉
安装完成运行程序,结果又出现了一堆问题:

OpenCV实例(八)车牌字符识别技术(三)汉字识别,OpenCV,opencv,人工智能,计算机视觉
原因是没有安装pytesseract需要的Tesseract-OCR工具,Windows版本的安装包的下载路径为https://github.com/UB-Mannheim/tesseract/wiki

OpenCV实例(八)车牌字符识别技术(三)汉字识别,OpenCV,opencv,人工智能,计算机视觉

直接双击该文件进行安装即可。这里的安装位置(这个路径要记住,后面要用)采用默认值:

     C:\Program Files\Tesseract-OCR

配置pytesseract.py打开“我的计算机”,进入\Users==\AppData\Local\Programs\Python\Python38\Lib\site-packages\pytesseract\,找到pytesseract.py文件,用文本编辑器打开这个文件,找到"tesseract_cmd"关键字

OpenCV实例(八)车牌字符识别技术(三)汉字识别,OpenCV,opencv,人工智能,计算机视觉

至此,字符识别开发环境准备好了,下面就可以编写代码了。

代码实例:

import cv2 as cv
from PIL import Image
import pytesseract as tess


def recoginse_text(image):
    """
    步骤:
    1、灰度,二值化处理
    2、形态学操作去噪
    3、识别
    :param image:
    :return:
    """

    # 灰度 二值化
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    # 如果是白底黑字 建议 _INV
    ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV| cv.THRESH_OTSU)


    # 形态学操作 (根据需要设置参数(1,2))
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,2))  #去除横向细线
    morph1 = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (2, 1)) #去除纵向细线
    morph2 = cv.morphologyEx(morph1,cv.MORPH_OPEN,kernel)
    cv.imshow("Morph",morph2)

    # 黑底白字取非,变为白底黑字(便于pytesseract 识别)
    cv.bitwise_not(morph2,morph2)
    textImage = Image.fromarray(morph2)

    # 图片转文字
    text=tess.image_to_string(textImage)
    n=10 #根据不同国家车牌固定数目进行设置
    print("识别结果:")
    print(text[1:n])
   


def main():
    # 读取需要识别的数字字母图片,并显示读到的原图
    src = cv.imread("cp.jpg")
    cv.imshow("src",src)

    # 识别
    recoginse_text(src)

    cv.waitKey(0)
    cv.destroyAllWindows()

if __name__=="__main__":
    main()



OpenCV实例(八)车牌字符识别技术(三)汉字识别,OpenCV,opencv,人工智能,计算机视觉

3.汉字识别代码实例

代码实例

import tkinter as tk
from tkinter.filedialog import *
from tkinter import ttk
import predict
import cv2
from PIL import Image, ImageTk
import threading
import time



class Surface(ttk.Frame):
	pic_path = ""
	viewhigh = 600
	viewwide = 600
	update_time = 0
	thread = None
	thread_run = False
	camera = None
	color_transform = {"green":("绿牌","#55FF55"), "yello":("黄牌","#FFFF00"), "blue":("蓝牌","#6666FF")}
		
	def __init__(self, win):
		ttk.Frame.__init__(self, win)
		frame_left = ttk.Frame(self)
		frame_right1 = ttk.Frame(self)
		frame_right2 = ttk.Frame(self)
		win.title("车牌识别")
		win.state("zoomed")
		self.pack(fill=tk.BOTH, expand=tk.YES, padx="5", pady="5")
		frame_left.pack(side=LEFT,expand=1,fill=BOTH)
		frame_right1.pack(side=TOP,expand=1,fill=tk.Y)
		frame_right2.pack(side=RIGHT,expand=0)
		ttk.Label(frame_left, text='原图:').pack(anchor="nw") 
		ttk.Label(frame_right1, text='车牌位置:').grid(column=0, row=0, sticky=tk.W)
		
		from_pic_ctl = ttk.Button(frame_right2, text="来自图片", width=20, command=self.from_pic)
		from_vedio_ctl = ttk.Button(frame_right2, text="来自摄像头", width=20, command=self.from_vedio)
		self.image_ctl = ttk.Label(frame_left)
		self.image_ctl.pack(anchor="nw")
		
		self.roi_ctl = ttk.Label(frame_right1)
		self.roi_ctl.grid(column=0, row=1, sticky=tk.W)
		ttk.Label(frame_right1, text='识别结果:').grid(column=0, row=2, sticky=tk.W)
		self.r_ctl = ttk.Label(frame_right1, text="")
		self.r_ctl.grid(column=0, row=3, sticky=tk.W)
		self.color_ctl = ttk.Label(frame_right1, text="", width="20")
		self.color_ctl.grid(column=0, row=4, sticky=tk.W)
		from_vedio_ctl.pack(anchor="se", pady="5")
		from_pic_ctl.pack(anchor="se", pady="5")
		self.predictor = predict.CardPredictor()
		self.predictor.train_svm()
		
	def get_imgtk(self, img_bgr):
		img = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
		im = Image.fromarray(img)
		imgtk = ImageTk.PhotoImage(image=im)
		wide = imgtk.width()
		high = imgtk.height()
		if wide > self.viewwide or high > self.viewhigh:
			wide_factor = self.viewwide / wide
			high_factor = self.viewhigh / high
			factor = min(wide_factor, high_factor)
			
			wide = int(wide * factor)
			if wide <= 0 : wide = 1
			high = int(high * factor)
			if high <= 0 : high = 1
			im=im.resize((wide, high), Image.ANTIALIAS)
			imgtk = ImageTk.PhotoImage(image=im)
		return imgtk
	
	def show_roi(self, r, roi, color):
		if r :
			roi = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB)
			roi = Image.fromarray(roi)
			self.imgtk_roi = ImageTk.PhotoImage(image=roi)
			self.roi_ctl.configure(image=self.imgtk_roi, state='enable')
			self.r_ctl.configure(text=str(r))
			self.update_time = time.time()
			try:
				c = self.color_transform[color]
				self.color_ctl.configure(text=c[0], background=c[1], state='enable')
			except: 
				self.color_ctl.configure(state='disabled')
		elif self.update_time + 8 < time.time():
			self.roi_ctl.configure(state='disabled')
			self.r_ctl.configure(text="")
			self.color_ctl.configure(state='disabled')
		
	def from_vedio(self):
		if self.thread_run:
			return
		if self.camera is None:
			self.camera = cv2.VideoCapture(0)
			if not self.camera.isOpened():
				mBox.showwarning('警告', '摄像头打开失败!')
				self.camera = None
				return
		self.thread = threading.Thread(target=self.vedio_thread, args=(self,))
		self.thread.setDaemon(True)
		self.thread.start()
		self.thread_run = True
		
	def from_pic(self):
		self.thread_run = False
		self.pic_path = askopenfilename(title="选择识别图片", filetypes=[("jpg图片", "*.jpg")])
		if self.pic_path:
			img_bgr = predict.imreadex(self.pic_path)
			self.imgtk = self.get_imgtk(img_bgr)
			self.image_ctl.configure(image=self.imgtk)
			resize_rates = (1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4)
			for resize_rate in resize_rates:
				print("resize_rate:", resize_rate)
				try:
					r, roi, color = self.predictor.predict(img_bgr, resize_rate)
				except:
					continue
				if r:
					break
			#r, roi, color = self.predictor.predict(img_bgr, 1)
			self.show_roi(r, roi, color)

	@staticmethod
	def vedio_thread(self):
		self.thread_run = True
		predict_time = time.time()
		while self.thread_run:
			_, img_bgr = self.camera.read()
			self.imgtk = self.get_imgtk(img_bgr)
			self.image_ctl.configure(image=self.imgtk)
			if time.time() - predict_time > 2:
				r, roi, color = self.predictor.predict(img_bgr)
				self.show_roi(r, roi, color)
				predict_time = time.time()
		print("run end")
		
		
def close_window():
	print("destroy")
	if surface.thread_run :
		surface.thread_run = False
		surface.thread.join(2.0)
	win.destroy()
	
	
if __name__ == '__main__':
	win=tk.Tk()
	
	surface = Surface(win)
	win.protocol('WM_DELETE_WINDOW', close_window)
	win.mainloop()
	

输出结果:

OpenCV实例(八)车牌字符识别技术(三)汉字识别,OpenCV,opencv,人工智能,计算机视觉文章来源地址https://www.toymoban.com/news/detail-654229.html

到了这里,关于OpenCV实例(八)车牌字符识别技术(三)汉字识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv-车牌识别

    ​ 最近研究了几天车牌识别的项目,现在记录一下学习的过程,基于OpenCV编写Python代码来完成这一任务。 ​ 文章末尾有源码,有兴趣的读者可以用jupyter notebook一步一步看执行过程和结果。 本项目车牌识别的步骤为: 加载图片 高斯去噪 灰度转换 边缘检测 闭运算,腐蚀膨胀

    2024年02月05日
    浏览(25)
  • 基于OpenCV 的车牌识别

    车牌识别是一种图像处理技术,用于识别不同车辆。这项技术被广泛用于各种安全检测中。现在让我一起基于 OpenCV 编写 Python 代码来完成这一任务。 车牌识别的相关步骤 1. 车牌检测:第一步是从汽车上检测车牌所在位置。我们将使用 OpenCV 中矩形的轮廓检测来寻找车牌。如

    2024年02月09日
    浏览(34)
  • Opencv识别车牌

    #encoding:utf8 import cv2 import numpy as np Min_Area = 50 #定位车牌 def color_position(img,output_path): colors = [#([26,43,46], [34,255,255]), # 黄色 ([100,43,46], [124,255,255]), # 蓝色 ([35, 43, 46], [77, 255, 255]) # 绿色 ] hsv =cv2.cvtColor(img, cv2.COLOR_BGR2HSV) for (lower, upper) in colors: lower = np.array(lower, dtype=“uint8”) # 颜色

    2023年04月26日
    浏览(24)
  • 车牌识别系统 opencv

             两个关键子系统: 车牌定位 和 字符识别 原始车辆图像采集 汽车牌照区域定位 汽车牌照内字符的分割 汽车牌照内字符的识别 车牌定位方法: 基于边缘检测的车牌定位方法 基于遗传算法的车牌定位方法 基于纹理特征的车牌定位方法 基于数学形态学的车牌定位

    2024年02月21日
    浏览(24)
  • OpenCV(项目)车牌识别1 -- 车牌提取(形态学)

    目录 一、形态学车牌提取(简单:单情景)  1、读取图片,转灰度图  2、提取轮廓(Sobel算子提取y方向边缘) 3、自适应二值化 4、闭运算处理,把图像闭合、揉团,使图像区域化 5、腐蚀/膨胀去噪得到车牌区域 5-1、横向腐蚀、膨胀 5-2、纵向腐蚀、膨胀 6、获取外轮廓 6-1、

    2024年02月08日
    浏览(28)
  • opencv机器学习车牌识别系统

    文章目录 0 前言+ 1 课题介绍+ 1.1 系统简介+ 1.2 系统要求+ 1.3 系统架构 2 实现方式+ 2.1 车牌检测技术+ 2.2 车牌识别技术+ 2.3 SVM识别字符+ 2.4 最终效果 3 最后 这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专

    2024年02月05日
    浏览(31)
  • 车牌识别 opencv python(简单版)

    实验目标 使用形态学处理,识别图片中车牌的位置,并识别每个字符的位置 实验原理 1.车牌识别: (1)车牌的背景色是 蓝色 ,所以先提取图中蓝色的部分,转化为二值图像(蓝色部分为1,其余为0)。 (2)再检测 边缘 ,标出边缘的外接矩形,根据此矩形的 长宽比 和面积,就

    2024年02月06日
    浏览(39)
  • OpenCV实战5 车牌号识别

    原文在这里,参考这个进行了改进 感觉学到了很多东西,便在这里作下笔记。 效果: 目录 一、知识点学习: 1. fstream 2. 形态学开操作与形态闭操作 2.1 第一个角度:消除较小的联通区域 vs 弥合较小的联通区域 2.2 第二个角度:消除背景噪音 vs 消除前景噪音 3、approPolyDp函数

    2024年02月01日
    浏览(43)
  • OpenCV完结篇——计算机视觉(人脸识别 || 车牌识别)

    scaleFactor调整哈尔级联器的人脸选框使其能框住人脸 官方教程指路 每个特征都是通过从黑色矩形下的像素总和减去白色矩形下的像素总和获得的单个值 级联器模型文件位置 识别嘴就会不精确了 识别鼻子 只要不测口,还是比较准确的 测口准确度太低!!! 安装很简单,这里

    2024年02月19日
    浏览(31)
  • 计算机视觉:使用opencv实现车牌识别

    汽车车牌识别(License Plate Recognition)是一个日常生活中的普遍应用,特别是在智能交通系统中,汽车牌照识别发挥了巨大的作用。汽车牌照的自动识别技术是把处理图像的方法与计算机的软件技术相连接在一起,以准确识别出车牌牌照的字符为目的,将识别出的数据传送至交

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包