Opencv SVM車牌識別

2021-07-30 20:11:01 字數 2913 閱讀 8074

車牌定位演算法在車牌識別技術中占有很重要地位,乙個車牌識別系統的識別率往往取決於車牌定位的成功率及準確度。

車牌定位有很多種演算法,從最簡單的來,車牌在影象中一般被認為是長方形,由於影象攝取角度不同也可能是四邊形。我們可以使用opencv中的例項: c:/program files/opencv/samples/c.squares.c 這是乙個搜尋中矩形的乙個演算法。我們只要稍微修改一下就可以實現定位車牌。

在這個例項中使用了canny演算法進行邊緣檢測,然後二值化,接著用cvfindcontours搜尋輪廓,最後從找到的輪廓中根據角點的個數,角的度數和輪廓大小確定,矩形位置。以下是效果圖:

這個演算法可以找到一些車牌位置,但在複雜雜訊背景下,或者車牌影象灰度與背景相差不大就很難定位車牌

所以我們需要尋找更好的定位演算法。下面是squares的**:

#ifdef _ch_

#pragma package

#endif

#ifndef _eic

#include "cv.h"

#include "highgui.h"

#include

#include

#include

#endif

int thresh = 50;

iplimage* img = 0;

iplimage* img0 = 0;

cvmemstorage* storage = 0;

cvpoint pt[4];

const char* wndname = "square detection demo";

// helper function:

// finds a cosine of angle between vectors

// from pt0->pt1 and from pt0->pt2 

double angle( cvpoint* pt1, cvpoint* pt2, cvpoint* pt0 )

// the function draws all the squares in the image

void drawsquares( iplimage* img, cvseq* squares )

// show the resultant image

cvshowimage( wndname, cpy );

cvreleaseimage( &cpy );

}void on_trackbar( int a )

char* names = ;

int main(int argc, char** argv)

img = cvcloneimage( img0 );

// create window and a trackbar (slider) with parent "image" and set callback

// (the slider regulates upper threshold, passed to canny edge detector) 

cvnamedwindow( wndname,0 );

cvcreatetrackbar( "canny thresh", wndname, &thresh, 1000, on_trackbar );

// force the image processing

on_trackbar(0);

// wait for key.

// also the function cvwaitkey takes care of event processing

c = cvwaitkey(0);

// release both images

cvreleaseimage( &img );

cvreleaseimage( &img0 );

// clear memory storage - reset free space position

cvclearmemstorage( storage );

if( c == 27 )

break;

}cvdestroywindow( wndname );

return 0;

}#ifdef _eic

main(1,"squares.c");

#endif

前面介紹了用opencv的squares例項定位車牌的演算法,效果不是很理想。車牌定位的方法有很多種,這裡我們從汽車影象的紋理特徵入手,找出車牌不同於背景的特徵是車牌定位的關鍵。觀察多幅汽車我們會發現車身和背景的紋理多為橫向紋理,而車牌字元則為豎向紋理,基於這個紋理特徵我們可以區別處車牌位置。車牌的定位我們可以分為如下幾個步驟:

1預處理

影象的預處理主要是為了後續處理的需要進行一些濾波和梯度增強的處理,以濾除雜訊和垂直方向上的增強。

2 sobel垂直方向邊緣檢測並2值化

一般的邊緣檢測的方法檢測到的邊緣資訊含有大量的無用資訊,這裡我們使用sobel邊緣檢測運算元對影象進行垂直邊緣檢測,由於車牌字元的豎向紋理特徵我們可以檢測到車牌字元,對得到的邊緣影象進行2值化,排除一些雜訊並增強字元邊緣。

3形態學變換

汽車影象還存在一些豎向的紋理(如車身,車燈等)我們需要排除這些干擾資訊,並把臨近的字元邊緣連通起來。這一階段主要利用對影象進行形態學操作,即作閉合(先膨脹在腐蝕)開啟(先腐蝕再膨脹)運算,膨脹可以把臨近邊緣連線成乙個整體,腐蝕可以濾除一些細碎的邊緣(建議使用3*1的結構進行操作)經過形態學變換可以濾除雜訊邊緣,得到車牌區域。

4篩選大多數影象經過形態學變化後都可以得到滿意的效果,但由於影象背景的一些特殊紋理,可能會留下一些沒有濾除的邊緣,也有可能字元間空隙較大,車牌區域出現分為幾部分的狀況,還有可能車身的一些標語等被誤認為是車牌影象等,我們還需要進行聚類和篩選。

選取乙個標準來判斷連通域(如豎直方向兩區域重合大於10畫素,水平方向兩區域距離小於10畫素)在根據車牌的形狀大小(寬,高)判斷是否為車牌區。

程式執行效果圖如下:

HyperLPR車牌識別

本文基於hyperlpr進行修改,完整 參考 hyperlpr是乙個使用深度學習針對對中文車牌識別的實現,與較為流行的開源的其他框架相比,它的檢測速度和魯棒性和多場景的適應性都要好於目前開源的框架,hyperlpr可以識別多種中文車牌包括白牌,新能源車牌,使館車牌,教練車牌,武警車牌等。使用的目標檢...

車牌識別程式

車牌識別程式 僅供學習使用 說明 此程式識別的車牌是在網上隨便找的,此程式中的二值化 形狀選擇和形態學處理的blob分析三步曲 並不具有普遍性。因為位置 光照 車牌清潔狀態等都會對車票識別造成很大的影響。只有使用mlp svm cnn 等人工智慧演算法訓練的程式,才具有比較高的普適性。1.採集影象 ...

車牌識別綜述

目前車牌識別所遇到的難點主要體現在三個方面,主要體現在 車牌傾斜,影象雜訊,還有車牌模糊。目前對車牌識別的方法大致可以分為三類,模板匹配,svm,和深度學習的方法,其中,深度學習的方法用的更加廣泛,深度學習上採用車牌識別的方法可分為直接檢測演算法和間接檢測演算法。對於車牌識別,有著不同的資料集,我們...