久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7962|回復: 0
收起左側

基于opencv的車牌識別

[復制鏈接]
ID:308987 發表于 2018-4-16 09:41 | 顯示全部樓層 |閱讀模式
車牌識別流程:


高斯模糊:
車牌識別中利用高斯模糊將圖片平滑化,去除干擾的噪聲對后續圖像處理的影響。
高斯模糊(GaussianBlur()),也叫高斯平滑。
周邊像素的平均值,所謂"模糊",可以理解成每一個像素都取周邊像素的平均值。
    cdbf6c81800a19d8b48e151733fa828ba61e4616.jpg 上圖中,2是中間點,周邊點都是1。"中間點"取"周圍點"的平均值,就會變成1。在數值上,這是一種"平滑化"。在圖形上,就相當于產生"模糊"效果,"中間點"失去細節(上圖右)。顯然,計算平均值時,取值范圍越大,"模糊效果"越強烈。
023b5bb5c9ea15ce8262711bb6003af33a87b210.jpg
左圖分別是原圖、模糊半徑3像素、模糊半徑10像素的效果。模糊半徑越大,圖像就越模糊。從數值角度看,就是數值越平滑。
接下來的問題就是,既然每個點都要取周邊像素的平均值,那么應該如何分配權重呢?
如果使用簡單平均,顯然不是很合理,因為圖像都是連續的,越靠近的點關系越密切,越遠離的點關系越疏遠。因此,加權平均更合理,距離越近的點權重越大,距離越遠的點權重越小。

OpenCV中函數
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)
參數詳解:
src:輸入圖片,可以使是任意通道數,該函數對通道是獨立處理的,但是深度只能是CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.
dst:輸出圖片,和輸入圖片相同大小和深度。
ksize:高斯內核大小。ksize.width和ksize.height允許不相同但他們必須是正奇數。或者等于0,由參數sigma的乘機決定。
sigmaX:高斯內核在X方向的標準方差。
sigmaY:高斯內核在Y方向的標準方差。如果sigmaY為0,他將和sigmaX的值相同,如果他們都為0,那么他們由ksize.width和ksize.height計算得出。
borderType:用于判斷圖像邊界的模式。
1 Mat Gaussian(Mat &img) {2     Mat out;3     GaussianBlur(img, out, Size(3, 3),4         0, 0, BORDER_DEFAULT);5     return out;6 7 }
View Code
原圖:(來自百度)
  

灰度化:
在車牌識別中我們需要將圖像轉化為灰度圖像,這樣有利于后續步驟的開展,如Soble算子只能作用于灰度圖像。
灰度化,在RGB模型中,如果R=G=B時,則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值,因此,灰度圖像每個像素只需一個字節存放灰度值(又稱強度值、亮度值),灰度范圍為0-255。
Opencv中函數
void cvtColor(InputArray src,  OutputArray dst,  int code,  int dstCn=0 )
參數詳解:
src輸入圖像:8位無符號的16位無符號(cv_16uc…)或單精度浮點。
dst的大小和深度src.
code輸出圖像顏色空間轉換的代碼。
dstCn目標圖像中的信道數;如果參數為0,則從SRC和代碼自動導出信道的數目。
1 Mat Grayscale(Mat &img) {2     Mat out;3     cvtColor(img, out, CV_RGB2GRAY);4 5     return out;6 }
View Code


Sobel算子(X方向):
車牌定位的核心算法,水平方向上的邊緣檢測,檢測出車牌區域。
主要用于獲得數字圖像的一階梯度,常見的應用和物理意義是邊緣檢測。在技術上,它是一個離散的一階差分算子,用來計算圖像亮度函數的一階梯度之近似值。在圖像的任何一點使用此算子,將會產生該點對應的梯度矢量或是其法矢量。
該算子包含兩組3x3的矩陣,分別為橫向及縱向,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。如果以A代表原始圖像,Gx及Gy分別代表經橫向及縱向邊緣檢測的圖像,其公式如下:


圖像的每一個像素的橫向及縱向梯度近似值可用以下的公式結合,來計算梯度的大小。


可用以下公式計算梯度方向。


在以上例子中,如果以上的角度Θ等于零,即代表圖像該處擁有縱向邊緣,左方較右方暗。

OpenCV中函數:
void Sobel(InputArray src, OutputArray dst, int ddepth, int xorder, int yorder, int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT )
參數:
src源圖像。
dst:相同大小和相同數量的通道的目標圖像。
ddepth:目標圖像的深度。
xorder:階導數的X.
yorder:階導數的Y.
ksize:擴展Sobel算子–大小。它必須是1, 3, 5,或者7。
scale計算衍生值的可選刻度因子。默認情況下,不應用縮放。看到getderivkernels()詳情。
delta :可選的delta值,在將它們存儲在DST之前添加到結果中。
bordertype:像素外推方法。
convertScaleAbs()——先縮放元素再取絕對值,最后轉換格式為8bit型。
1 Mat Sobel(Mat &img) { 2     Mat out; 3     Mat grad_x, grad_y; 4     Mat abs_grad_x, abs_grad_y; 5 6     //X方向 7     //Sobel(img, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT); 8     //convertScaleAbs(grad_x, abs_grad_x); 9     Sobel(img, img, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);10     convertScaleAbs(img, out);11 12     //Y方向13     //Sobel(img, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);14     //convertScaleAbs(grad_y, abs_grad_y);15     //convertScaleAbs(img, out);16 17     //合并18     //addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, out);19 20     return out;21 }
View Code


二值化:
進一步對圖像進行處理,強化目標區域,弱化背景。
圖像的二值化,就是將圖像上的像素點的灰度值設置為0或255,也就是將整個圖像呈現出明顯的只有黑和白的視覺效果。
OpenCV中函數
double threshold(InputArray src, OutputArray dst, double thresh, double maxVal, int thresholdType)
參數:
src源陣列(單通道,32位浮點8位)。
dst:相同大小和類型的目標數組。
thresh門限閾值。
Maxval:最大值使用的thresh_binary和thresh_binary_inv閾值類型。
thresholdtype:閾值型,如下。
THRESH_BINARY  當前點值大于閾值時,取Maxval,也就是第四個參數,下面再不說明,否則設置為0
THRESH_BINARY_INV 當前點值大于閾值時,設置為0,否則設置為Maxval
THRESH_TRUNC 當前點值大于閾值時,設置為閾值,否則不改變
THRESH_TOZERO 當前點值大于閾值時,不改變,否則設置為0
THRESH_TOZERO_INV 當前點值大于閾值時,設置為0,否則不改變
1 Mat TwoValued(Mat &img) {2     Mat out;3     threshold(img, out, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);4     //threshold(img, out, 100, 255, CV_THRESH_BINARY);5 6     return out;7 }
View Code


閉操作:
閉操作可以將目標區域連成一個整體,便于后續輪廓的提取。
閉操作可使輪廓線更光滑,但與開操作相反的是,閉操作通常消彌狹窄的間斷和長細的鴻溝,消除小的空洞,并填補輪廓線中的斷裂。
使用結構元素B對集合A進行閉操作,定義為


這個公式表明,使用結構元素B對集合A的閉操作就是用B對A進行膨脹,然后用B對結果進行腐蝕

OpenCV中函數
void morphologyEx(InputArray src, OutputArray dst, int op, InputArray element, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
參數:
src:源圖像。
dst:相同大小和類型的目標圖像。
element內核類型    用getStructuringElement函數得到。
OP:
可以是以下形式之一的形態學操作的類型:
morph_open -開啟操作
morph_close -閉合操作
morph_gradient -形態學梯度
morph_tophat“頂帽”
morph_blackhat -“黑帽”
iterations侵蝕和膨脹的次數被應用。
bordertype–像素外推方法。
bordervalue–邊界值在一個恒定的邊界情況。默認值有特殊含義。
關注前4個參數即可,后面用默認參數。

1 Mat Close(Mat &img) {2     Mat out;3     //Mat element(5, 5, CV_8U, cv::Scalar(1));4     Mat element = getStructuringElement(MORPH_RECT, Size(17, 5));5     morphologyEx(img, out, cv::MORPH_CLOSE, element);6 7     return out;8 }
View Code


取輪廓:
將前面處理的車牌目標區域提取出來。
相關函數:
查找輪廓:
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())
image輸入的 8-比特、單通道圖像. 非零元素被當成 1, 0 象素值保留為 0 - 從而圖像被看成二值的。為了從灰度圖像中得到這樣的二值圖像,可以使用 cvThreshold, cvAdaptiveThreshold 或 cvCanny. 本函數改變輸入圖像內容。
storage :得到的輪廓的存儲容器
first_contour :輸出參數:包含第一個輸出輪廓的指針
header_size :如果 method=CV_CHAIN_CODE,則序列頭的大小 >=sizeof(CvChain),否則 >=sizeof(CvContour) .
mode
提取模式.
CV_RETR_EXTERNAL - 只提取最外層的輪廓
CV_RETR_LIST - 提取所有輪廓,并且放置在 list 中
CV_RETR_CCOMP - 提取所有輪廓,并且將其組織為兩層的 hierarchy: 頂層為連通域的外圍邊界,次層為洞的內層邊界。
CV_RETR_TREE - 提取所有輪廓,并且重構嵌套輪廓的全部 hierarchy
method :
逼近方法 (對所有節點, 不包括使用內部逼近的 CV_RETR_RUNS).
CV_CHAIN_CODE - Freeman 鏈碼的輸出輪廓. 其它方法輸出多邊形(定點序列).
CV_CHAIN_APPROX_NONE - 將所有點由鏈碼形式翻譯(轉化)為點序列形式
CV_CHAIN_APPROX_SIMPLE - 壓縮水平、垂直和對角分割,即函數只保留末端的象素點;
CV_CHAIN_APPROX_TC89_L1,
CV_CHAIN_APPROX_TC89_KCOS - 應用 Teh-Chin 鏈逼近算法. CV_LINK_RUNS - 通過連接為 1 的水平碎片使用完全不同的輪廓提取算法。僅有 CV_RETR_LIST 提取模式可以在本方法中應用.
offset :
每一個輪廓點的偏移量. 當輪廓是從圖像 ROI 中提取出來的時候,使用偏移量有用,因為可以從整個圖像上下文來對輪廓做分析.
函數 cvFindContours 從二值圖像中提取輪廓,并且返回提取輪廓的數目。指針 first_contour 的內容由函數填寫。它包含第一個最外層輪廓的指針,如果指針為 NULL,則沒有檢測到輪廓(比如圖像是全黑的)。其它輪廓可以從 first_contour 利用 h_next 和 v_next 鏈接訪問到。 在 cvDrawContours 的樣例顯示如何使用輪廓來進行連通域的檢測。輪廓也可以用來做形狀分析和對象識別 - 見CVPR2001 教程中的 squares 樣例。該教程可以在 SourceForge 網站上找到。

繪制輪廓:
void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, intthickness=1, int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )


相關參數參考——http://www.opencv.org.cn/opencvd ... urs#cv.DrawContours

漫水填充算法:
int floodFill(InputOutputArray image, Point seed, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), ScalarupDiff=Scalar(), int flags=4 )


相關參數參考——http://www.opencv.org.cn/opencvd ... odfill#cv.FloodFill
aec379310a55b31961a2c69743a98226cefc17fc.jpg
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99热国产精品 | 91秦先生艺校小琴 | 亚洲一区二区视频 | 国产午夜精品一区二区三区 | 一区二区三区四区电影 | 国内自拍偷拍 | 日韩成人在线播放 | 99精品欧美一区二区蜜桃免费 | 色又黄又爽网站www久久 | 99亚洲精品| 国产a级毛毛片 | 国产精品美女一区二区 | 国产成人jvid在线播放 | 男女又爽又黄视频 | 天天干天天玩天天操 | 午夜精品久久久久久久星辰影院 | 国产精品色 | 午夜爽爽男女免费观看hd | 国产一区91精品张津瑜 | 国产精品日产欧美久久久久 | 午夜国产| 国产欧美在线播放 | 国产精品一区二区在线 | 国产美女免费视频 | 99re视频在线 | 成人亚洲精品久久久久软件 | 日韩精品一区二区三区视频播放 | 在线免费国产 | 精品一区二区免费视频 | 国产精品视频网 | 成人一区二区三区在线观看 | 91国内精品久久 | 一久久久 | 欧洲一级毛片 | 国产一区中文字幕 | 91久久久www播放日本观看 | 国产激情在线播放 | 夜夜精品浪潮av一区二区三区 | 在线观看国产视频 | 中文字幕国产一区 | 国产精品毛片无码 |