收藏 分享(赏)

车牌识别Python程序.doc

上传人:精品资料 文档编号:10806218 上传时间:2020-01-10 格式:DOC 页数:38 大小:24.73KB
下载 相关 举报
车牌识别Python程序.doc_第1页
第1页 / 共38页
车牌识别Python程序.doc_第2页
第2页 / 共38页
车牌识别Python程序.doc_第3页
第3页 / 共38页
车牌识别Python程序.doc_第4页
第4页 / 共38页
车牌识别Python程序.doc_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、# -*- coding: utf-8 -*-_author_ = d1bysjimport pymysqldb = pymysql.connect(host = , # 远程主机的 ip 地址,user = , # MySQL 用户名db = , # database 名passwd = , # 数据库密码port = 3306, #数据库监听端口,默认 3306charset = “utf8“) #指定 utf8 编码的连接cur= db.cursor()sql=“select * from sex“try:cur.execute(sql)re=cur.fetchall()for it i

2、n re:name = it0num = it1print(name,num)except Exception as e:raise efinally:db.close()import cv2import numpy as npfrom numpy.linalg import normimport sysimport osimport jsonSZ = 20 # 训练图片长宽MAX_WIDTH = 1000 # 原始图片最大宽度Min_Area = 2000 # 车牌区域允许最大面积PROVINCE_START = 1000# 读取图片文件def imreadex(filename):retu

3、rn cv2.imdecode(np.fromfile(filename, dtype=np.uint8), cv2.IMREAD_COLOR)def point_limit(point):if point0 threshold:up_point = 0is_peak = Truewave_peaks = for i, x in enumerate(histogram):if is_peak and x 2:is_peak = Falsewave_peaks.append(up_point, i)elif not is_peak and x = threshold:is_peak = True

4、up_point = iif is_peak and up_point != -1 and i - up_point 4:wave_peaks.append(up_point, i)return wave_peaks# 根据找出的波峰,分隔图片,从而得到逐个字符图片def seperate_card(img, waves):part_cards = for wave in waves:part_cards.append(img:, wave0:wave1)return part_cards# 来自 opencv 的 sample,用于 svm 训练def deskew(img):m = cv2

5、.moments(img)if abs(mmu02) 1:continueroot_int = ord(os.path.basename(root)for filename in files:filepath = os.path.join(root, filename)digit_img = cv2.imread(filepath)digit_img = cv2.cvtColor(digit_img, cv2.COLOR_BGR2GRAY)chars_train.append(digit_img)# chars_label.append(1)chars_label.append(root_in

6、t)chars_train = list(map(deskew, chars_train)chars_train = preprocess_hog(chars_train)# chars_train = chars_train.reshape(-1, 20, 20).astype(np.float32)chars_label = np.array(chars_label)print(chars_train.shape)self.model.train(chars_train, chars_label)if os.path.exists(“svmchinese.dat“):self.modelc

7、hinese.load(“svmchinese.dat“)else:chars_train = chars_label = for root, dirs, files in os.walk(“traincharsChinese“):if not os.path.basename(root).startswith(“zh_“):continuepinyin = os.path.basename(root)index = provinces.index(pinyin) + PROVINCE_START + 1 # 1 是拼音对应的汉字for filename in files:filepath =

8、 os.path.join(root, filename)digit_img = cv2.imread(filepath)digit_img = cv2.cvtColor(digit_img, cv2.COLOR_BGR2GRAY)chars_train.append(digit_img)# chars_label.append(1)chars_label.append(index)chars_train = list(map(deskew, chars_train)chars_train = preprocess_hog(chars_train)# chars_train = chars_t

9、rain.reshape(-1, 20, 20).astype(np.float32)chars_label = np.array(chars_label)print(chars_train.shape)self.modelchinese.train(chars_train, chars_label)def save_traindata(self):if not os.path.exists(“svm.dat“):self.model.save(“svm.dat“)if not os.path.exists(“svmchinese.dat“):self.modelchinese.save(“s

10、vmchinese.dat“)def accurate_place(self, card_img_hsv, limit1, limit2, color):row_num, col_num = card_img_hsv.shape:2xl = col_numxr = 0yh = 0yl = 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

11、 # 绿色有渐变for i in range(row_num):count = 0for 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 col_num_limit:if yl i:yl = iif yh row_num - row_num_limit:if xl j:xl = jif xr MAX_WIDTH:resize_rate = MAX_WIDTH / pic_widthimg = cv2.re

12、size(img, (MAX_WIDTH, int(pic_hight * resize_rate), interpolation=cv2.INTER_AREA)blur = self.cfg“blur“# 高斯去噪if blur 0:img = cv2.GaussianBlur(img, (blur, blur), 0) # 图片分辨率调整oldimg = imgimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# equ = cv2.equalizeHist(img)# img = np.hstack(img, equ)# 去掉图像中不会是车牌的区域ke

13、rnel = np.ones(20, 20), np.uint8)img_opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)img_opening = cv2.addWeighted(img, 1, img_opening, -1, 0);# 找到图像边缘ret, img_thresh = cv2.threshold(img_opening, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)img_edge = cv2.Canny(img_thresh, 100, 200)# 使用开运算和闭运算

14、让图像边缘成为一个整体kernel = np.ones(self.cfg“morphologyr“, self.cfg“morphologyc“), np.uint8)img_edge1 = cv2.morphologyEx(img_edge, cv2.MORPH_CLOSE, kernel)img_edge2 = cv2.morphologyEx(img_edge1, cv2.MORPH_OPEN, kernel)# 查找图像边缘整体形成的矩形区域,可能有很多,车牌就在其中一个矩形区域中image, contours, hierarchy = cv2.findContours(img_edg

15、e2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours = cnt for cnt in contours if cv2.contourArea(cnt) Min_Areaprint(len(contours), len(contours)# 一一排除不是车牌的矩形区域car_contours = for cnt in contours:rect = cv2.minAreaRect(cnt)area_width, area_height = rect1if area_width 2 and wh_ratio -1 and rect2 point0

16、:left_point = pointif low_point1 point1:low_point = pointif heigth_point1 right_point1: # 负角度new_left_point = left_point0, heigth_point1pts2 = np.float32(new_left_point, heigth_point, right_point) # 字符只是高度需要改变pts1 = np.float32(left_point, heigth_point, right_point)M = cv2.getAffineTransform(pts1, pt

17、s2)dst = cv2.warpAffine(oldimg, M, (pic_width, pic_hight)point_limit(right_point)point_limit(heigth_point)point_limit(new_left_point)card_img = dstint(right_point1):int(heigth_point1), int(new_left_point0):int(right_point0)card_imgs.append(card_img)# cv2.imshow(“card“, card_img)# cv2.waitKey(0)# 开始使

18、用颜色定位,排除不是车牌的矩形,目前只识别蓝、绿、黄车牌colors = for card_index, card_img in enumerate(card_imgs):green = yello = blue = black = white = 0card_img_hsv = cv2.cvtColor(card_img, cv2.COLOR_BGR2HSV)# 有转换失败的可能,原因来自于上面矫正矩形出错if card_img_hsv is None:continuerow_num, col_num = card_img_hsv.shape:2card_img_count = row_nu

19、m * col_numfor 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 34: # 图片分辨率调整yello += 1elif 35 34: # 图片分辨率调整green += 1elif 99 34: # 图片分辨率调整blue += 1if 0 = card_img_count:color = “yello“limit1 = 11limit2 = 34 #

20、 有的图片有色偏偏绿elif green * 2 = card_img_count:color = “green“limit1 = 35limit2 = 99elif blue * 2 = card_img_count:color = “blue“limit1 = 100limit2 = 124 # 有的图片有色偏偏紫elif black + white = card_img_count * 0.7: # TODOcolor = “bw“print(color)colors.append(color)print(blue, green, yello, black, white, card_im

21、g_count)# cv2.imshow(“color“, card_img)# cv2.waitKey(0)if limit1 = 0:continue# 以上为确定车牌颜色# 以下为根据车牌颜色再定位,缩小边缘非车牌边界xl, xr, yh, yl = self.accurate_place(card_img_hsv, limit1, limit2, color)if yl = yh and xl = xr:continueneed_accurate = Falseif yl = yh:yl = 0yh = row_numneed_accurate = Trueif xl = xr:xl

22、= 0xr = col_numneed_accurate = Truecard_imgscard_index = card_imgyl:yh, xl:xr if color != “green“ or yl = yh:yl = 0yh = row_numif xl = xr:xl = 0xr = col_numcard_imgscard_index = card_imgyl:yh, xl:xr if color != “green“ or yl max_wave_dis * 0.6:breakelse:cur_dis += wave1 - wave0if i 0:wave = (wave_pe

23、aks00, wave_peaksi1)wave_peaks = wave_peaksi + 1:wave_peaks.insert(0, wave)# 去除车牌上的分隔点point = wave_peaks2if point1 - point0 = 7: # 1 太细,认为是边缘continuepredict_result.append(charactor)roi = card_imgcard_color = colorbreakreturn predict_result, roi, card_color # 识别到的字符、定位的车牌图像、车牌颜色if _name_ = _main_:c =

24、 CardPredictor()c.train_svm()r, roi, color = c.predict(“test/66.jpg“)car = .join(r)print(car)# -*- coding: utf-8 -*import serialimport timeimport predictimport cv2import RPi.GPIO as GPIOimport picamerafrom time import sleepfrom threading import Threadclass deal:def _init_(self):# 设置不显示警告global sergl

25、obal cGPIO.setwarnings(False)# 设置读取面板针脚模式# 将引脚设置为输入模式GPIO.setmode(GPIO.BCM)# 设置读取针脚标号GPIO.setup(4, GPIO.IN)# GPIO.setup(2, GPIO.OUT)# 串口初始化ser = serial.Serial(“/dev/ttyAMA0“, 9600 ,timeout=0)time.sleep(1)c = predict.CardPredictor()c.train_svm()print(init ok!)def serial_send(self,strcar):#串口发送程序print

26、(in serial)if ser.isOpen = False:ser.open()print(open)ser.write(strcar.encode(encoding=“GB2312“)try:while True:size = ser.inWaiting()if size != 0:response = ser.read(size)print (response)print(send ok!)ser.flushInput()time.sleep(0.1)except KeyboardInterrupt:if ser != None:print(none)ser.close()else:

27、print(opened)print(strcar.encode(encoding=“GB2312“)ser.write(strcar.encode(encoding=“GB2312“)print(send ok!)print(income)size = ser.inWaiting()if size != 0:print(size)response = ser.read(size)print(response)print(send ok!)ser.flushInput()time.sleep(0.1)ser.close()def camera_vedio(self):#global img_b

28、gr#if self.camera is None:#self.camera = cv2.VideoCapture(0)#if not self.camera.isOpened():# print(警告,摄像头打开失败!)# self.camera = None# return#predict_time = time.time()# _, img_bgr = self.camera.read()#print(Already photographed)camera = picamera.PiCamera()camera.capture(img_bgr.jpg)camera.start_previ

29、ew()camera.vflip = Truecamera.hflip = Truecamera.brightness = 30sleep(0.01)camera.close()if _name_ = _main_:b = deal()while True:b._init_()try:if GPIO.input(4) = GPIO. LOW:print(Exorbitant vehicles)time.sleep(0.01) # wait 10 ms to give CPU chance to do other thingsb.camera_vedio()time.sleep(0.01) #

30、wait 10 ms to give CPU chance to do other thingsimg_bgr = “img_bgr.jpg“r, roi, color = c.predict(img_bgr)car_str = .join(r)if car_str.strip() != “:b.serial_send(#)print(recongnize ok!)print(car_str)b.serial_send(car_str)b.serial_send(%)print(Runing)except KeyboardInterrupt:if ser != None:ser.close()import tkinter as tkfrom tkinter.filedialog import *from tkinter import ttkimport predictimport cv2from PIL import Image, ImageTkimport threadingimport timeclass Surface(ttk.Frame):

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报