基于LabVIEW+python实现车牌识别智能系统的设计
时间:2023-03-02 11:00:00
一、系统应用介绍
二是主要实现技术原理
2.1车辆检测
2.2车牌定位
2.三车牌字符分割
2.4牌照字符识别方法
三、技术实现
四、开发环境
4.1LabVIEW介绍和数据采集卡
4.2python介绍
五、程序及步骤
5.1车牌类型识别和保存
5.读取识别图片
5.3图片预处理
5.4排除不属于车牌的矩形区域
5.5颜色定位
5.减少非车牌边界
5.7测试
六、LabVIEWOCR实现车牌识别
6.1OCR
6.2前面板
一、系统应用介绍
车牌识别系统(VehicleLicensePlateRecognition,VLPR)是指能够检测到被监控道路上的车辆并自动提取车辆牌照信息(包括汉字字符、英文字母、阿拉伯数字和车牌颜色)的技术。车牌识别是现代智能交通系统的重要组成部分之一,应用广泛。车牌识别是现代智能交通系统的重要组成部分之一,应用广泛。基于数字图像处理、模式识别、计算机视觉等技术,分析摄像机拍摄的车辆图像或视频序列,获得每辆车唯一的车牌号,完成识别过程。停车场收费管理、交通流量控制指标测量、车辆定位、车辆防盗、公路超速自动化监管、闯红灯电子警察、公路收费站等功能可通过一些后续处理手段实现。维护交通安全和城市治安,防止交通堵塞,实现交通自动化管理具有现实意义。
车牌号是车辆唯一的身份标志,车牌自动识别技术可实现车辆身份的自动登记和验证,无需任何变更,该技术已应用于公路收费、停车管理、称重系统、交通诱导、交通执法、公路检查、车辆调度、车辆检测等场合。
二是主要实现技术原理
2.1车辆检测
车辆检测可采用埋地线圈检测、红外检测、雷达检测技术、视频检测等方式。视频检测可避免损坏路面,无需附加外部检测设备,无需纠正触发位置,节省费用,更适合移动便携式应用的要求。
其次,视频车辆检测系统需要具有较高的处理速度和优秀的算法,以实现图像采集和处理,而不丢失帧。如果处理速度慢,会导致帧丢失,使系统无法检测到行驶速度快的车辆,也难以保证识别处理在有利于识别的位置开始,影响系统识别率。因此,将视频车辆检测与车牌自动识别相结合具有一定的技术难度。
2.2车牌定位
在自然环境中,汽车图像背景复杂,光线不均匀。如何在自然背景中准确确定牌照区域是整个识别过程的关键。首先,对收集到的视频图像进行广泛的相关搜索,找到几个符合汽车牌照特征的区域作为候选区域,然后进一步分析和判断这些候选区域,最后选择最佳区域作为许可区域,并将其与图像分离。
2.三车牌字符分割
牌照区域定位完成后,将牌照区域划分为单个字符,然后识别。垂直投影法通常用于字符分割。由于字符在垂直方向上的投影必须接近字符之间或字符之间的间隙,且该位置应满足字符书写格式、字符、尺寸限制等许可证的条件。采用垂直投影法对复杂环境下汽车图像中的字符分割有很好的效果。
2.4牌照字符识别方法
车牌识别系统主要基于模板匹配算法和人工神经网络算法。基于模板匹配算法,首先将分割后的字符二值化,将其尺寸缩放到字符数据库中的模板尺寸,然后匹配所有模板,选择最佳匹配作为结果。基于人工神经网络的算法有两种:一种是先提取字符的特征,然后用获得的特征训练神经网络分配器;另一种方法是直接将图像输入网络,通过网络自动提取特征,直到识别结果。
其次,在实际应用中,车牌识别系统的识别率也与车牌质量和拍摄质量密切相关。许可证的质量会受到各种因素的影响,如锈蚀、污染、油漆剥落、字体褪色、许可证堵塞、许可证倾斜、亮反射、多许可证、假许可证等;实际拍摄过程也会受到环境亮度、拍摄方法、车速等因素的影响。这些影响因素不同程度地降低了车牌识别的识别率,这也是车牌识别系统的困难和挑战。为了提高识别率,除了不断改进识别算法外,还应找到克服各种光照条件的方法,使收集到的图像最有利于识别。
三、技术实现
车牌自动识别是一种利用车辆动态视频或静态图像自动识别车牌号码和车牌颜色的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。一些牌照识别系统还具有通过视频图家判断车辆进入视野的功能,称为视频车辆检测。一个完整的车牌识别系统应包括车辆检测、图像采集、车牌识别等。当车辆检测部分检测到车辆到达时,触发图像采集单元,采集当前视频图像。许可证识别单元处理图像,定位许可证位置,然后分割许可证中的字符进行识别,然后形成许可证号码输出
四、开发环境
4.1LabVIEW介绍和数据采集卡
LabVIEW美国国家的一种仪器(NI)公司开发的程序开发环境类似于C和BASIC开发环境。LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式,是NI设计平台的核心也是开发测量或控制系统的理想选择,旨在帮助工程师和科学家解决问题,提高生产力,不断创新。
数据采集(DAQ),是指从传感器等待测设备的模拟和数字被测单元中自动采集非电量或电量信号,送到上位机进行分析和处理。数据采集系统是一种基于计算机或其他特殊测试平台的测量软硬件产品的灵活定制测量系统。
视频采集卡:
● DV AV Audio全接口视频捕获卡,质量与性能的完美结合,SMD贴片电容,做工精良
●全接口板卡,集成立体声输入端口,无需转接声卡
p>●独有音频协处理功能,两路立体声输入捕获,声音质量大幅提高,并杜绝音频、视频不同●低温优化设计,保证超长时间捕获的稳定性
●杂波屏蔽电路,使捕获的图像画质更清晰
●专业色键抠像功能,影片效果更精彩
●全接口配备,可捕获任何视频播放设备中的素材
输入接口:AV/SVIDEO/DV
视频:720X576/352X288
音频:8/16/32/44。1/48
制式:N/P制
驱动:标准的DSHOW驱动
4.2python介绍
Python是一种解释型脚本语言,可以应用于以下领域:
-
Web和Internet开发
-
科学计算和统计
-
人工智能
-
教育
-
桌面界面开发
-
软件开发
-
后端开发
-
网络接口:能方便进行系统维护和管理,Linux下标志性语言之一,是很多系统管理员理想的编程工具。
系统编程:提供API(Application Programming Interface应用程序编程接口),能方便进行系统维护和管理,Linux下标志性语言之一,是很多系统管理员理想的编程工具。
图形处理:有PIL、Tkinter等图形库支持,能方便进行图形处理。
数学处理:NumPy扩展提供大量与许多标准数学库的接口。
文本处理:python提供的re模块能支持正则表达式,还提供SGML,XML分析模块,许多程序员利用python进行XML程序的开发。
数据库编程:程序员可通过遵循Python DB-API(数据库应用程序编程接口)规范的模块与Microsoft SQL Server,Oracle,Sybase,DB2,MySQL、SQLite等数据库通信。python自带有一个Gadfly模块,提供了一个完整的SQL环境。
网络编程:提供丰富的模块支持sockets编程,能方便快速地开发分布式应用程序。很多大规模软件开发计划例如Zope,Mnet 及BitTorrent. Google都在广泛地使用它。
Web编程:应用的开发语言,支持最新的XML技术。
多媒体应用:Python的PyOpenGL模块封装了“OpenGL应用程序编程接口”,能进行二维和三维图像处理。PyGame模块可用于编写游戏软件。
五、程序及步骤
算法:
5.1车牌类型识别及保存
class PlateRecognition():
client_id = 'LR6w0HKc8Yzjd8q6FPTkrgpR'
client_secret = 'UyKYwPp38XkPAwPxl9pYpW0WsccfnBc9'
def __init__(self):
self.MAX_WIDTH = 1000 # 原始图片最大宽度
self.Min_Area = 2000 # 车牌区域允许最大面积
self.PROVINCE_START = 1000
# 省份代码保存在provinces.json中
with open('provinces.json', 'r', encoding='utf-8') as f:
self.provinces = json.load(f)
# 车牌类型保存在cardtype.json中,便于调整
with open('cardtype.json', 'r', encoding='utf-8') as f:
self.cardtype = json.load(f)
# 字母所代表的地区保存在Prefecture.json中,便于更新
with open('Prefecture.json', 'r', encoding='utf-8') as f:
self.Prefecture = json.load(f)
# 车牌识别的部分参数保存在js中,便于根据图片分辨率做调整
f = open('config.js')
j = json.load(f)
for c in j["config"]:
if c["open"]:
self.cfg = c.copy()
break
def __del__(self):
pass
5.2读取识别图片
def __imreadex(self, filename):
return cv2.imdecode(np.fromfile(filename, dtype=np.uint8), cv2.IMREAD_COLOR)
def __point_limit(self, point):
if point[0] < 0:
point[0] = 0
if point[1] < 0:
point[1] = 0
def accurate_place(self, card_img_hsv, limit1, limit2, color):
row_num, col_num = card_img_hsv.shape[:2]
xl = col_num
xr = 0
yh = 0
yl = row_num
# col_num_limit = self.cfg["col_num_limit"]
row_num_limit = self.cfg["row_num_limit"]
col_num_limit = col_num * 0.8 if color != "green" else col_num * 0.5 # 绿色有渐变
for i in range(row_num):
count = 0
for j in range(col_num):
H = card_img_hsv.item(i, j, 0)
S = card_img_hsv.item(i, j, 1)
V = card_img_hsv.item(i, j, 2)
if limit1 < H <= limit2 and 34 < S and 46 < V:
count += 1
if count > col_num_limit:
if yl > i:
yl = i
if yh < i:
yh = i
for j in range(col_num):
count = 0
for i in range(row_num):
H = card_img_hsv.item(i, j, 0)
S = card_img_hsv.item(i, j, 1)
V = card_img_hsv.item(i, j, 2)
if limit1 < H <= limit2 and 34 < S and 46 < V:
count += 1
if count > row_num - row_num_limit:
if xl > j:
xl = j
if xr < j:
xr = j
return xl, xr, yh, yl
5.3图片预处理
def pretreatment(self, car_pic):
if type(car_pic) == type(""):
img = self.__imreadex(car_pic)
else:
img = car_pic
pic_hight, pic_width = img.shape[:2]
if pic_width > self.MAX_WIDTH:
resize_rate = self.MAX_WIDTH / pic_width
img = cv2.resize(img, (self.MAX_WIDTH, int(pic_hight * resize_rate)),
interpolation=cv2.INTER_AREA) # 图片分辨率调整
# cv2.imshow('Image', img)
blur = self.cfg["blur"]
5.4排除不属于车牌的矩形区域
car_contours = []
for cnt in contours:
# 框选 生成最小外接矩形 返回值(中心(x,y), (宽,高), 旋转角度)
rect = cv2.minAreaRect(cnt)
# print('宽高:',rect[1])
area_width, area_height = rect[1]
# 选择宽大于高的区域
if area_width < area_height:
area_width, area_height = area_height, area_width
wh_ratio = area_width / area_height
# print('宽高比:',wh_ratio)
# 要求矩形区域长宽比在2到5.5之间,2到5.5是车牌的长宽比,其余的矩形排除
if wh_ratio > 2 and wh_ratio < 5.5:
car_contours.append(rect)
box = cv2.boxPoints(rect)
box = np.int0(box)
# 框出所有可能的矩形
# oldimg = cv2.drawContours(img, [box], 0, (0, 0, 255), 2)
# cv2.imshow("Test",oldimg )
# print(car_contours)
5.5颜色定位
for i in range(row_num):
for j in range(col_num):
H = card_img_hsv.item(i, j, 0)
S = card_img_hsv.item(i, j, 1)
V = card_img_hsv.item(i, j, 2)
if 11 < H <= 34 and S > 34: # 图片分辨率调整
yellow += 1
elif 35 < H <= 99 and S > 34: # 图片分辨率调整
green += 1
elif 99 < H <= 124 and S > 34: # 图片分辨率调整
blue += 1
if 0 < H < 180 and 0 < S < 255 and 0 < V < 46:
black += 1
elif 0 < H < 180 and 0 < S < 43 and 221 < V < 225:
white += 1
color = "no"
# print('黄:{:<6}绿:{:<6}蓝:{:<6}'.format(yellow,green,blue))
limit1 = limit2 = 0
if yellow * 2 >= card_img_count:
color = "yellow"
limit1 = 11
limit2 = 34 # 有的图片有色偏偏绿
elif green * 2 >= card_img_count:
color = "green"
limit1 = 35
limit2 = 99
elif blue * 2 >= card_img_count:
color = "blue"
limit1 = 100
limit2 = 124 # 有的图片有色偏偏紫
elif black + white >= card_img_count * 0.7:
color = "bw"
# print(color)
colors.append(color)
# print(blue, green, yellow, black, white, card_img_count)
if limit1 == 0:
continue
5.6缩小非车牌边界
xl, xr, yh, yl = self.accurate_place(card_img_hsv, limit1, limit2, color)
if yl == yh and xl == xr:
continue
need_accurate = False
if yl >= yh:
yl = 0
yh = row_num
need_accurate = True
if xl >= xr:
xl = 0
xr = col_num
need_accurate = True
card_imgs[card_index] = card_img[yl:yh, xl:xr] \
if color != "green" or yl < (yh - yl) // 4 else card_img[yl - (yh - yl) // 4:yh, xl:xr]
if need_accurate: # 可能x或y方向未缩小,需要再试一次
card_img = card_imgs[card_index]
card_img_hsv = cv2.cvtColor(card_img, cv2.COLOR_BGR2HSV)
xl, xr, yh, yl = self.accurate_place(card_img_hsv, limit1, limit2, color)
if yl == yh and xl == xr:
continue
if yl >= yh:
yl = 0
yh = row_num
if xl >= xr:
xl = 0
xr = col_num
card_imgs[card_index] = card_img[yl:yh, xl:xr] \
if color != "green" or yl < (yh - yl) // 4 else card_img[yl - (yh - yl) // 4:yh, xl:xr]
# cv2.imshow("result", card_imgs[0])
# cv2.imwrite('1.jpg', card_imgs[0])
# print('颜色识别结果:' + colors[0])
return card_imgs, colors
5.7测试
if __name__ == '__main__':
c = PlateRecognition()
# card_imgs, colors = c.pretreatment('./2.jpg')
result = c.get_license_plate('./2.jpg')
# cv2.imshow('card', card_imgs)
cv2.waitKey(0)
六、LabVIEW OCR实现车牌识别
6.1OCR
OCR(光学字符识别)是指机器自动从图像中识别文本字符的过程,OCR机器视觉系统可用于对被测件的识别和分类。常见的识别应用包括:药品包装标签识别、IC芯片编码读取、冲压零件上的字符识别、汽车零件编码读取以及车牌识别等
OCR对图像中的文本进行读取时,会先将图像中的各个字符图像分割开来,并将字符的特征向量与字符集中保存的特征向量进行对比,选取满足条件的最佳匹配向量所对应的字符值作为读取识别结果。若有必要,也可以通过字符验证过程对OCR的识别质量进行验证。
OCR技术面