人工智能綜合項目開發(fā)- 課件 項目八 車牌識別閘機控制系統(tǒng)模擬實驗_第1頁
人工智能綜合項目開發(fā)- 課件 項目八 車牌識別閘機控制系統(tǒng)模擬實驗_第2頁
人工智能綜合項目開發(fā)- 課件 項目八 車牌識別閘機控制系統(tǒng)模擬實驗_第3頁
人工智能綜合項目開發(fā)- 課件 項目八 車牌識別閘機控制系統(tǒng)模擬實驗_第4頁
人工智能綜合項目開發(fā)- 課件 項目八 車牌識別閘機控制系統(tǒng)模擬實驗_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

人工智能綜合項目開發(fā)項目八車牌識別閘機控制系統(tǒng)模擬實驗成都職業(yè)技術(shù)學院項目分析01任務(wù)一車牌識別模型部署02任務(wù)二閘機控制系統(tǒng)構(gòu)建03項目八

車牌識別閘機控制系統(tǒng)模擬實驗項目分析智慧停車場管理系統(tǒng)首先實現(xiàn)車牌數(shù)據(jù)采集;然后利用深度學習神經(jīng)網(wǎng)絡(luò)算法進行

車牌檢測和車牌識別;然后根據(jù)識別結(jié)果對閘機進行控制,以及

LCD

屏幕顯示車牌識別

結(jié)果。學習神經(jīng)網(wǎng)絡(luò)數(shù)學模型基本概念;學習損失函數(shù)、優(yōu)化器的基本概念;掌握神經(jīng)網(wǎng)絡(luò)模型訓練的基本流程;掌握使用神經(jīng)網(wǎng)絡(luò)解決車牌識別問題的方法;掌握嵌入式系統(tǒng)開發(fā)基本流程。

1.車牌識別概述車牌識別系統(tǒng)是計算機視頻圖像識別技術(shù)在車輛牌照識別中的一種應(yīng)用,能夠?qū)⑦\

動中的車輛牌照信息(包括漢字字符、英文字母、阿拉伯數(shù)字及號牌顏色)從復雜的背

景中提取并識別出來,通過車牌提取、圖像預(yù)處理、特征提取、車牌字符識別等技術(shù),

識別車輛牌號、顏色等信息。目前對車牌的字母和數(shù)字的識別率均可達到

99%以上。根據(jù)應(yīng)用條件和要求的不同,車牌識別產(chǎn)品也有多種類型。從實現(xiàn)模式來說,分為

軟識別和硬識別兩種。軟識別即車牌識別軟件,基本是安裝的

PC

端、服務(wù)器端,前端硬件設(shè)備采集視頻或

抓拍圖片,傳輸?shù)胶蠖藥в凶R別軟件識別端進行識別,這種技術(shù)多數(shù)應(yīng)用在前期模擬相

機時代停車場,高速公路,電子警察,但這種方式對分析端要求較高,如中間傳輸出現(xiàn)

中斷或者后端出現(xiàn)重啟情況,就無法實時進行識別。特別是在一些小型場景,比如停車

場,加油站,新能源電動車充電站內(nèi),PC

在崗亭或者機房,經(jīng)常由于溫度、潮濕等條件

影響,也會存在不穩(wěn)定情況;另外在特定場景,由于天氣、復雜環(huán)境、角度影響,識別率遲遲達不到很高標準,所以軟識別已經(jīng)很少使用。硬識別即前端實現(xiàn)視頻圖像采集處理,自動補光,自適應(yīng)各種復雜環(huán)境,車輛號碼

自動識別并輸出一體化設(shè)備,這種模式采用嵌入式技術(shù),把深度學習算法植入到專用攝

像機硬件中。具有運算速度快、器件體積小、穩(wěn)定性強,自適應(yīng)強等特點。當前,車牌識別技術(shù)已經(jīng)廣泛應(yīng)用于停車管理、稱重系統(tǒng)、靜態(tài)交通車輛管理、公

路治超、公路稽查、車輛調(diào)度、車輛檢測等各種場合,對于維護交通安全和城市治安,

防止交通堵塞,實現(xiàn)交通自動化管理有著現(xiàn)實的意義。車牌識別技術(shù)是智慧停車場系統(tǒng)中的重要組成部分。本次智慧停車場管理的第一個

任務(wù)就是車牌識別模型部署,如圖

8.0-1

所示的車牌識別系統(tǒng)開發(fā)流程圖中,獲取到車

牌圖像后就進行車牌識別模型部署任務(wù)。圖

8.0-1

車牌識別系統(tǒng)開發(fā)流程圖其中車牌識別模型部署主要分為三個步驟實現(xiàn),首先提取出圖像中的車牌大致位置;

然后再利用透視變換和垂直精細繪圖提取出車牌的精確位置;最后利用

OCR(Optical

Character

Recognition)字符識別方法識別出車牌號并輸出。車牌提取詳細流程如圖

8.0-2

所示。圖

8.0-2

車牌提取詳細流程圖2.閘機控制系統(tǒng)概述實現(xiàn)車牌識別之后就可以確定是否放行然后控制道閘打開或者關(guān)閉。閘機控制系統(tǒng)

流程如圖

8.0-3

所示:圖

8.0-3

閘機控制系統(tǒng)流程圖閘機系統(tǒng)底層功能實現(xiàn)結(jié)構(gòu)分析流程圖如圖

8.0-4

所示,識別到車牌信息后,通過

WiFi

通信協(xié)議將識別結(jié)果發(fā)送給智能節(jié)點核心控制板,智能節(jié)點核心控制板再通過串口

控制舵機執(zhí)行器開啟,同時語音識別模塊自動播報閘機狀態(tài)及識別的車牌和車位數(shù)信息。

LCD

顯示屏將識別的車牌號和車位數(shù)量信息進行顯示。智能節(jié)點核心控制板再將底層實現(xiàn)

的功能數(shù)據(jù)通過

WiFi

通信協(xié)議上傳。圖

8.0-4

閘機系統(tǒng)底層功能實現(xiàn)結(jié)構(gòu)分析流程圖任務(wù)一

車牌識別模型部署(1)車牌粗定位首先對車牌進行初步檢測定位,檢測出車牌的大致位置。對圖像進行一些插補和調(diào)

整圖像大小比例,然后核心的部分就是

cascade

級聯(lián)分類器的應(yīng)用。這里的級聯(lián)分類器

是基于

Haar+Adaboost

構(gòu)成的,也即

cascade.xml

文件,該文件存放了一些車牌的

Haar

特征。在這里我們采用了

cascade.xml

檢測模型,然后使用

OpenCV

detectMultiscale的方法來對圖像進行滑動窗口遍歷尋找車牌,實現(xiàn)車牌的粗定位。

#

實現(xiàn)車牌粗定位watch_cascade

=

cv2.CascadeClassifier("cascade.xml")

#

加載車牌檢測的級聯(lián)分類器#

獲取車牌粗定位區(qū)域。image_gray:灰度圖。def

detectPlateRough(watch_cascade,

image_gray,

resize_h=720,

en_scale=1.08,

top_bottom_padding_rate=0.05):if

top_bottom_padding_rate

>

0.2:print("error:top_bottom_padding_rate

>

0.2:",

top_bottom_padding_rate)exit(1)height

=

image_gray.shape[0]padding

=

int(height

*

top_bottom_padding_rate)scale

=

image_gray.shape[1]

/

float(image_gray.shape[0])image

=

cv2.resize(image_gray,

(int(scale*resize_h),

resize_h))image_color_cropped

=

image[padding:resize_h-padding,

0:image_gray.shape[1]]image_gray

=

cv2.cvtColor(image_color_cropped,

cv2.COLOR_RGB2GRAY)5#

滑動窗口遍歷尋找車牌watches

=

watch_cascade.detectMultiScale(image_gray,

en_scale,

2,

minSize=(36,

9),

maxSize=(36*40,

9*40))cropped_images

=

[]for

(x,

y,

w,

h)

in

watches:#

從圖形中剪裁車牌區(qū)域cropped_origin

=

cropped_from_image(image_color_cropped,

(int(x),

int(y),

int(w),

int(h)))x

-=

w

*

0.14w

+=

w

*

0.28y

-=

h

*

0.6h

+=

h

*

1.1

其中

detectMultiscale()函數(shù)為多尺度多目標檢測。多尺度通常搜索目標的模板尺

寸大小是固定的,但不同圖片大小不同,目標對象的大小也是不定的,因此多尺度即不

斷縮放圖片大?。s放到與模板匹配),通過模板滑動窗函數(shù)搜索匹配。同一幅圖片可

能在不同尺度下都得到匹配值,所以多尺度檢測函數(shù)

detectMultiscale()是多尺度合并

的結(jié)果。因此

cascade.xml

這個文件是通過很多的正樣本車牌圖片和負樣本非車牌圖片轉(zhuǎn)換

cascade.xml

文件,其中的

Haar

特征數(shù)據(jù)已經(jīng)過

Adaboost

處理。通過這個

xml

文件就

可以訓練出一個級聯(lián)分類器,該分類器的判別車牌標準是通過計算大量車牌特征后得出

的一個閾值,大于這個閾值判別為車牌,否則判別為非車牌,如圖

8.0-1

所示。通過該

方法就得到了圖像中車牌的粗定位。cropped

=

cropped_from_image(image_color_cropped,

(int(x),

int(y),

int(w),

int(h)))#

將找到的所有車牌存放入列表cropped_images.append([cropped,

[x,

y+padding,

w,

h],

cropped_origin])return

cropped_images

#

返回車牌位置圖

8.0-1

車牌檢測判定示意圖粗定位后的圖像如圖

8.0-2

所示:圖

8.0-2

車牌粗定位(2)車牌精定位對車牌進行粗定位后,再對車牌進行精定位。這里的精定位其實就是切掉原來粗定

位后車牌的多余部分,這里使用首先使用透視變換矯正車牌位置,然后調(diào)用

tflite

模型實現(xiàn)垂直精細繪圖方法輸出車牌精定位。使用

OpenCV

getPerspectiveTransform()和

warpPerspective()函數(shù)實現(xiàn)透視變換,矯正圖像中的車牌位置。#

透視變換實現(xiàn)車牌矯正def

findContoursAndDrawBoundingBox(image_rgb):line_upper

=

[]line_lower

=

[]line_experiment

=

[]gray_image

=

cv2.cvtColor(image_rgb,cv2.COLOR_BGR2GRAY)for

k

in

np.linspace(-50,

0,

15):binary_niblack

=

cv2.adaptiveThreshold(gray_image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,17,k)

#

自適應(yīng)閾值二值化contours,

hierarchy

=

cv2.findContours(binary_niblack.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for

contour

in

contours:bdbox

=

cv2.boundingRect(contour)if

(bdbox[3]/float(bdbox[2])>0.7

and

bdbox[3]*bdbox[2]>100

and

bdbox[3]*bdbox[2]<1200)

line_upper.append([bdbox[0],bdbox[1]])

line_lower.append([bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]])

line_experiment.append([bdbox[0],bdbox[1]])

line_experiment.append([bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]])rgb

=

cv2.copyMakeBorder(image_rgb,30,30,0,0,cv2.BORDER_REPLICATE)

#

邊緣填充

leftyA,

rightyA

=

fitLine_ransac(np.array(line_lower),

3)leftyB,

rightyB

=

fitLine_ransac(np.array(line_upper),

-3)or

(bdbox[3]/float(bdbox[2])>3

and

bdbox[3]*bdbox[2]<100):rows,cols

=

rgb.shape[:2]pts_map1

=

np.float32([[cols

-

1,

rightyA],

[0,

leftyA],

[cols

-

1,

rightyB],

[0,

leftyB]])pts_map2

=

np.float32([[136,36],[0,36],[136,0],[0,0]])mat

=

cv2.getPerspectiveTransform(pts_map1,pts_map2)

#

透視變換image

=

cv2.warpPerspective(rgb,mat,(136,

36),flags=cv2.INTER_CUBIC)

#

透視變換image,

M

=

fastDeskew(image)

#

圖像矯正return

image

#

返回矯正后的圖像矯正后的圖像如圖

8.0-3

所示:圖

8.0-3

車牌矯正調(diào)用

tflite

模型實現(xiàn)垂直精細繪圖方法輸出車牌精定位。#

加載

tflite

模型class

TfliteRun:def

init

(self,

model_name="model12",

model_path=POSENET_MODEL):"""model_name:

模型名稱model_path:

模型路徑"""erpreter

=

tflite.Interpreter(model_path=model_path)

#

讀取模型self.interpreter.allocate_tensors()

self.model_name

=

model_name#

分配張量#

獲取輸入層和輸出層維度self.input_details

=

erpreter.get_input_details()

self.output_details

=

erpreter.get_output_details()#

實現(xiàn)模型推理

def

inference(self,

img):input_data

=

img

self.interpreter.set_tensor(self.input_details[0]['index'],

input_data)

erpreter.invoke()

#

模型推理output_data1

=

erpreter.get_tensor(self.output_details[0]['index'])

#

獲取輸出層數(shù)據(jù)

return

output_data1#

模型推理class

model12Rec(object):def

init

(self,

model_path=L12REC_PATH):self.tflite_run

=

TfliteRun(model_path=model_path)

#

加載

tflite

模型

def

imgPreprocessing(self,

img):resized

=

cv2.resize(img,

(66,

16))

resized

=

resized.astype(np.float32)

/

255

resized

=

resized[np.newaxis,

:]return

resized

def

inference(self,

img):img

=

self.imgPreprocessing(img)

#

圖片預(yù)處理

return

self.tflite_run.inference(img)[0]

#

模型推理#

定義垂直精細繪圖函數(shù)def

finemappingVertical(res,

image):

print("keras_predict",

res)res

=

res*image.shape[1]

res

=

res.astype(16)

H,T

=

res

H

-=

3if

H

<

0:

H

=

0T

+=

2if

T

>=

image.shape[1]-1:

T

=

image.shape[1]-1image

=

image[0:35,

H:T+2]image

=

cv2.resize(image,

(int(136),

int(36)))

return

image

#

返回車牌精定位圖片model12_rec

=

model12Rec("model12.tflite")plate

=

finemappingVertical(self.model12_rec.inference(plate),

plate)

#

輸入矯正后的車牌,調(diào)用模型實現(xiàn)垂直精細繪圖,輸出車牌精定位。精定位后的圖像如圖

8.0-4

所示:圖

8.0-4

車牌精定位(3)車牌識別實現(xiàn)確定好車牌的位置后,對該車牌字符信息進行識別,最終輸出車牌號。車牌字符信

息識別采用

OCR

字符識別技術(shù),也就是在不分割字符的前提下能夠識別出車牌一共七個

字符。傳統(tǒng)的車牌字符識別就是先分割字符然后再逐一使用分類算法進行識別。不分割

字符直接識別方式的優(yōu)點就是僅需要較少的字符樣本即可用于分類器的訓練。目前大多

數(shù)商業(yè)車牌識別軟件采用的就是這種方法。如果在某些惡劣的自然情況下,車牌字符的

分割和識別就變得尤其困難,傳統(tǒng)的方法并不能取得很好的結(jié)果,這時候也可以采用整

體識別方式。通常車牌由七個字符組成,就可以采用多標簽分類的方法直接輸出多個標

簽,如圖

8.0-5

所示:

8.0-5

車牌識別多標簽分類輸出示例輸入車牌精定位圖片,加載

OCR

字符識別模型返回字符識別結(jié)果。import

onnxruntime

as

ort#

加載

ONNX

模型,識別字符

class

OnnxRun:def

init

(self,

model_name="ocr_rec",

model_path="ocr_rec.onnx"):

"""model_name:

模型名稱

model_path:

模型路徑

"""self.model_name

=

model_nameself.ort_session

=

ort.InferenceSession(model_path)

self.input_name

=

self.ort_session.get_inputs()[0].name

input

=

self.ort_session.get_inputs()output

=

self.ort_session.get_outputs()#

模型推理

def

inference(self,

img):input_data

=

imgreturn

self.ort_session.run(None,

{self.input_name:

input_data})加載字符標簽文件解析

OCR

字符識別模型推理結(jié)果,輸出車牌字符。

class

ProcessPred(object):#

獲取字符識別標簽文件def

init

(self,

character_dict_path=None,

character_type='ch',

use_space_char=False):

self.character_str

=

''with

open(character_dict_path,

'rb')

as

fin:

lines

=

fin.readlines()for

line

in

lines:line

=

line.decode('utf-8').strip('\n').strip('\r\n')self.character_str

+=

lineif

use_space_char:self.character_str

+=

'

'dict_character

=

list(self.character_str)dict_character

=

self.add_special_char(dict_character)self.dict

=

{}for

i,

char

in

enumerate(dict_character):self.dict[char]

=

iself.character

=

dict_characterdef

add_special_char(self,

dict_character):dict_character

=

['blank']

+

dict_characterreturn

dict_character最后返回車牌識別結(jié)果,如圖

8.0-6

所示:圖

8.0-6

車牌識別結(jié)果任務(wù)二

閘機控制系統(tǒng)構(gòu)建1.系統(tǒng)硬件模塊在閘機系統(tǒng)中,采用了智能節(jié)點核心控制板、舵機執(zhí)行器、LCD

顯示屏、語音識別模塊攝像頭等硬件模塊。1)智能節(jié)點核心控制板:主要實現(xiàn)與項目軟件部分進行通信,獲取車牌識別結(jié)果并將閘機狀態(tài)上傳,同時通

過串口控制舵機執(zhí)行器開關(guān),控制

LCD

顯示屏顯示車牌號等功能。2)舵機執(zhí)行器:舵機是一種位置(角度)伺服的驅(qū)動器,適用于一些需要角度不斷變化并可以保持

的控制系統(tǒng)。舵機實際上是一種俗稱,其是一種伺服馬達。舵機

SG90

有三根線控制。暗灰色線為

GND,地線;紅色線為

VCC,電源線,工作電壓

4.8~7.2V,通常情況下使用+5V

做電源電壓;橙黃色線為控制線,通過該線輸入脈沖

信號,從而控制舵機轉(zhuǎn)動,其轉(zhuǎn)動角度為

180°。3)LCD

顯示屏:TFT-LCD

即薄膜晶體管液晶顯示器。主要實現(xiàn)車牌號和車位數(shù)顯示功能。2.基于車牌識別的道閘控制系統(tǒng)

1)車牌識別功能插件構(gòu)建實現(xiàn)第一個功能插件,車牌圖像獲取功能插件。調(diào)用攝像頭獲取車牌圖像,獲取車

牌識別結(jié)果消息隊列,并調(diào)用函數(shù)實現(xiàn)車牌識別結(jié)果繪制。class

VideoThread(threading.Thread):def

init

(self,

camera="0",

q_flask:Queue=None,q_img:Queue=None,

q_rec:Queue=None,

q_send=None,

full_dict=None):

threading.Thread.

init

(self)self.cap

=

setCamera(camera)

#

網(wǎng)絡(luò)攝像頭

self.q_flask

=

q_flaskself.full_dict

=

full_dictself.embd_drive

=

EmbdDrive(q_send=q_send)def

run(self):

pricet

=

[]

while

True:if

self.cap

!=

"":ret,

frame

=

self.cap.read()#

調(diào)用攝像頭,獲取車牌圖像幀frame

=

cv2.resize(frame,

(ai_cfg.CAM_WIDTH,

ai_cfg.CAM_HEIGHT))self.q_img

=

q_img

self.q_rec

=

q_rec#

消息隊列傳遞原始圖像到識別插件

#

消息隊列傳遞

AI

模型的推理結(jié)果#

原始圖像傳遞if

not

self.q_img.full()

and

not

frame

is

None:self.q_img.put(bytearray(frame))if

not

self.q_rec.empty():pricet

=

self.q_rec.get()

#

獲取車牌識別結(jié)果消息隊列frame,

lpr_strs

=

recImgDis(frame,

pricet)

#

車牌識別結(jié)果繪制self.embd_drive.gatePlate(lpr_strs[0])self.full_dict[config.PLATE_STR]

=

lpr_strs[0]log.info(lpr_strs)#

傳遞結(jié)果繪制圖像if

not

self.q_flask.full()

and

not

frame

is

None:self.q_flask.put(bytearray(frame))2)車牌識別模型推理功能插件實現(xiàn)。獲取待識別車牌圖像,調(diào)用車牌識別函數(shù)實現(xiàn)車牌識別,并將識別結(jié)果傳遞到消息隊列。class

FaceMaskRecThread(threading.Thread):def

init

(self,

q_img:Queue=None,

q_rec:Queue=None):threading.Thread.

init

(self)self.q_img

=

q_img

self.q_rec

=

q_rec#

消息隊列傳遞原始圖像到識別插件

#

消息隊列傳遞

AI

模型的推理結(jié)果self.face_detect_rec

=

LicensePlateRec(detect_path=ai_cfg.PLATE_DETECT_PATH,

ocr_rec_path=ai_cfg.PLATE_OCR_PATH,

ocr_keys_path=ai_cfg.OCR_KEYS_PATH,

l12_path=ai_cfg.L12REC_PATH)def

run(self):while

True:if

self.q_img.empty():continueelse:image

=

self.q_img.get()

#

獲取當前圖片幀if

image

!=

False:image

=

np.array(image).reshape(ai_cfg.CAM_HEIGHT,

ai_cfg.CAM_WIDTH,

3)else:breakface_detect_pricet

=

self.face_detect_rec.inference(image)

#

調(diào)用車牌識別模型推理函數(shù)if

self.q_rec.full():continueelse:self.q_rec.put(face_detect_pricet)

#

傳遞識別結(jié)果

q_rec

消息隊列然后定義車牌識別模型推理函數(shù),輸入待識別車輛圖像,然后調(diào)用車牌檢測級聯(lián)分類器模型提取車牌圖像,再對提取出的車牌圖像進行矯正和精提取,最后調(diào)用

OCR

字符識別模型和字符標簽文件輸出車牌號。class

LicensePlateRec(object):def

init

(self,

detect_path=PLATE_DETECT_PATH,

#

車牌檢測級聯(lián)分類器ocr_rec_path=PLATE_OCR_PATH,#

OCR

字符識別模型ocr_keys_path=OCR_KEYS_PATH,#

字符標簽文件l12_path

=

L12REC_PATH):

#

加載車牌檢測的級聯(lián)分類器#

車牌精定位模型self.watch_cascade

=

cv2.CascadeClassifier(detect_path)

self.model12_rec

=

model12Rec(l12_path)self.onnx_run

=

OnnxRun(model_path=ocr_rec_path)

self.postprocess_op

=

ProcessPred(ocr_keys_path,

'ch',

True)

self.predictions

=

[]#

輸入數(shù)據(jù)預(yù)處理函數(shù)

def

imgPreprocessing(self,

img):h,

w

=

img.shape[:2]

max_wh_ratio

=

w

*

1.0

/

himgC,

imgH,

imgW

=

[int(v)

for

v

in

"3,

32,

100".split(",")]assert

imgC

==

img.shape[2]

imgW

=

int((32

*

max_wh_ratio))

h,

w

=

img.shape[:2]ratio

=

w

/

float(h)

if

math.ceil(imgH

*

ratio)

>

imgW:resized_w

=

imgW

else:resized_w

=

int(math.ceil(imgH

*

ratio))resized_image

=

cv2.resize(img,

(resized_w,

imgH)).astype('float32')

resized_image

=

resized_image.transpose((2,

0,

1))

/

255resized_image

-=

0.5

resized_image

/=

0.5padding_im

=

np.zeros((imgC,

imgH,

imgW),

dtype=np.float32)padding_im[:,

:,

0:resized_w]

=

resized_image

padding_im

=

padding_im[np.newaxis,

:]return

padding_im

#

車牌識別

def

inference(self,

img):lpr_strs

=

[]

boxs

=

[]#

車牌區(qū)域提取images

=

detectPlateRough(self.watch_cascade,

img,

img.shape[0],

top_bottom_padding_rate=0.1)for

i,

plate

in

enumerate(images):plate,

rect,

origin_plate

=

plate

#

邊距填充后的車牌、車牌坐標、原始車牌圖片

plate

=

cv2.resize(plate,

(136,

36

*

2))plate

=

findContoursAndDrawBoundingBox(plate)

#

車牌位置字符較正plate

=

finemappingVertical(self.model12_rec.inference(plate),

plate)

#

垂直精細繪圖

plate

=

finemappingVertical(self.model12_rec.inference(plate),

plate)

#

垂直精細繪圖

input_data

=

self.imgPreprocessing(plate)

#

輸入數(shù)據(jù)預(yù)處理ocr_rec

=

self.onnx_run.inference(input_data)

#

字符識別模型推理#

調(diào)用字符標簽文件解析車牌字符識別模型輸出結(jié)果

lpr_str

=

self.postprocess_op(ocr_rec[0])[0]boxs.append(rect)

#

獲取車牌位置lpr_strs.append(lpr_str[0])

#

獲取車牌識別結(jié)果self.predictions

=

[lpr_strs,

boxs]

#

返回車牌號和車牌位置

return

self.predictions識別到車牌后,將識別結(jié)果傳遞到

q_rec

識別結(jié)果消息隊列,車牌圖像獲取線程就

會對識別結(jié)果進行繪制。根據(jù)返回的車牌位置坐標,利用

OpenCV

繪制出矩形框?qū)④嚺瓶?/p>

選出,再將車牌號顯示到矩形框上方,從而實現(xiàn)車牌識別結(jié)果的可視化顯示。

#

繪制識別結(jié)果def

recImgDis(img,

process_pred,

font_path=False):lpr_strs

=

[]if

process_pred:lpr_strs,

boxs

=

process_predfor

i,

rect

in

enumerate(boxs):cv2.rectangle(img,

(int(rect[0]),

int(rect[1])),(int(rect[0]

+

rect[2]),

int(rect[1]

+

rect[3])),(0,

0,

255),

2,

cv2.LINE_AA)cv2.rectangle(img,

(int(rect[0]

-

1),

int(rect[1])

-

16),(int(rect[0]

+

115

+

50),

int(rect[1])),(0,

0,

255),

-1,

cv2.LINE_AA)if

font_path:img

=

putText(img,

str(lpr_strs[i]),org=(int(rect[0]+1),

int(rect[1]-16)),font_path=FONT_PATH)else:img

=

putText(img,

str(lpr_strs[i]),

org=(int(rect[0]+1),

int(rect[1]-16)))if

not

lpr_strs:

識別效果如圖

8.11

所示:圖

8.11

車牌識別任務(wù)(2)道閘控制系統(tǒng)功能插件構(gòu)建最后實現(xiàn)嵌入式設(shè)備數(shù)據(jù)傳遞插件,將車牌識別結(jié)果以及閘機控制指令傳遞給閘機

控制系統(tǒng)。識別到車牌后不能直接將字符識別結(jié)果傳遞到道閘控制系統(tǒng),需要將字符識別結(jié)果

進行轉(zhuǎn)換后再發(fā)送給道閘控制系統(tǒng)。

lpr_strs.append("")return

img,

lpr_strs#

嵌入式系統(tǒng)控制指令轉(zhuǎn)換def

gatePlate(self,

plt="京

1_+23)(456"):#

清除字母數(shù)字之外的所有字符

plate

=

re.sub("\W",

"",

plt)plate

=

re.sub("_",

"",

plate)

try:if

len(plate)

<

7:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論