基於OpenCV的交通標誌識別

前幾天看新聞得知微軟爲美國執法機關研發了一套基於AI識別,追蹤並提取編輯視頻中出現的人臉的算法,只要輸入一段帶人臉信息的視頻文件,運行後便可輸出一段全部人臉已被提取而且按要求編輯好的視頻文件。固然該算法目前仍然存在侷限,在人臉被部分遮擋、快速移動等狀況下,沒法正確識別,同時,執法機關也並不是想要一個視頻文件中相關不相關的全部人的人臉被獲取出來,算法真正應用於實際也許還需通過一番優化。算法

相似上述新聞中從視頻或圖像中提取人臉或其它信息的學科稱爲計算機圖形學(Computer Graphics),該門學科涵蓋面很廣,對於遊戲愛好者來講,所看到的遊戲畫面精美流暢與否,與計算機的實時渲染有很大關係。另外3D遊戲中模型爲了呈現得更逼真的模擬現實的光照效果,AR/VR中的實時建模/渲染,都與CG悉悉相關。函數

因而本着學無止境的思想,嘗試對計算機圖形學入個門。該項目使用的是OpenCV2.4.9的庫,至於爲何用這麼老的庫是由於我大學時下好了這個庫在電腦裏,而且這個項目比較初級用3+版本和2+版本沒有差異。學習

OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,能夠運行在Linux、Windows、Android和Mac
OS操做系統上。它輕量級並且高效——由一系列 C 函數和少許 C++
類構成,同時提供了 Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的不少通用算法。

OpenCV用C++語言編寫,它的主要接口也是C++語言,可是依然保留了大量的C語言接口。該庫也有大量的Python、Java and
MATLAB/OCTAVE(版本2.5)的接口。這些語言的API接口函數能夠經過在線文檔得到。現在也提供對於C#、Ch、Ruby的支持。優化

【百度百科如是說】spa

固然,一開始不能直接識別人臉等比較複雜多變的圖形,本文是經過實現交通標誌識別來作一個簡單的講解,至於更進一步的圖象識別你們有興趣能夠繼續學習。本次項目實現的交通標誌識別主要是給予一張待識別圖片,運行代碼,系統提取到圖中的交通標誌內容並使用霍夫圓變換將其位置圈出。操作系統

識別交通標誌位置的方法步驟以下:3d

1. 提取特徵顏色 — 對圖片去噪 — 提取邊緣信息code

2. Canny邊緣檢測 — Hough變換找出圓形區域視頻

交通標誌牌一般規定爲紅、藍、黃三種顏色,其含義爲: blog

1. 紅色:表示禁止、中止
2. 藍色:表示指令、必須遵照的規定
3. 黃色:表示警告、注意

1、提取特徵顏色

根據這三種交通標誌牌的顏色,初步肯定待識別圖片所要提取圖片信息的顏色範圍,代碼中使用的是RGB顏色模型。RGB顏色模型是位於空間中的一個立體模型,以下圖所示爲RGB的色度座標示意圖
圖片描述

在特徵顏色提取中,肯定顏色的閾值是其中最重要的一點(HSV顏色模型能夠避免光 照不一樣的影響,此處不討論),通過查詢資料,獲得紅、藍、黃對應的閾值以下:
圖片描述

其中ThR=0.4;ThG=0.3,ThB=0.4,ThY=0.85

在這種狀況下, G份量的值比R份量和B份量大50則斷定綠色,:B份量的值比G份量和R份量大50則斷定藍色, R份量的值比G份量和B份量大50則斷定爲紅色,找到知足條件的區域後在原圖中標出,不知足條件的部分標爲黑色。

首先讀取圖片文件代碼以下:

圖片描述

提取顏色區域代碼:

圖片描述

上述三個被調用的函數,做用是根據咱們查得的閥值進行判斷並返回值,若是在閥值範圍內,則返回255:

圖片描述

在這種由閥值提取顏色區域的狀況下,綠色極有可能混入被提取的顏色中,在背景綠葉過多的狀況下,檢測會比較困難。

2、圖片去噪

通過上一步的提取後,留下的區域則爲感興趣的區域,因爲閾值範圍的問題,留下的區域並不必定都是咱們所須要的區域。在現實狀況中,常常會有一部分咱們不須要,極容易使實驗結果出錯的圖片部分混入顏色提取範圍。這種不該該,也最好不要出如今被提取區域上的像素點,稱爲噪點

前人在去噪方面也有着傑出的做爲,方框濾波、中值濾波以及高斯濾波,都能或多或少地起到去噪做用。爲了接下來的邊緣檢測,咱們通常採用能獲得較好圖像邊緣的高斯濾波來對圖片進行去噪,對圖片信號進行平滑處理。

對於圖像處理來講,經常使用二維零均值離散高斯函數做平滑濾波器。

二維高斯函數爲:

圖片描述

使用去噪函數的代碼以下:
圖片描述

該函數是OpenCV庫中自帶的濾波函數,能夠直接調用

3、提取邊緣信息

Canny邊緣檢測算子是John F.Canny於 1986 年開發出來的一個多級邊緣檢測算法。Canny邊緣檢測算法以Canny的名字命名,被不少人推崇爲當今最優的邊緣檢測的算法。

Canny邊緣檢測的步驟通常分爲下列4步:
  • 消除噪聲(通常狀況下,使用高斯平滑濾波器卷積降噪)
  • 計算梯度幅值和方向(略複雜不作詳述)
  • 非極大值抑制(這一步排除非邊緣像素,僅僅保留了一些細線條,作爲候選邊緣)
  • 滯後閾值(滯後閾值須要兩個閾值(高閾值和低閾值)):

    若是某一像素位置的幅值超太高閾值, 該像素被保留爲邊緣像素。
    
    若是某一像素位置的幅值小於低閾值, 該像素被排除。
    
    若是某一像素位置的幅值在兩個閾值之間,該像素僅僅在鏈接到一個高於高閾值的像素時被保留。

對於Canny函數的使用,推薦的高低閾值比在2:1到3:1之間

圖片描述

4、Hough圓變換

霍夫圓變換的基本原理和上面講的霍夫線變化大致上是很相似的,只是點對應的二維極徑極角空間被三維的圓心點x, y還有半徑r空間取代。

對直線來講, 一條直線能由參數極徑極角表示. 而對圓來講, 咱們須要三個參數來表示一個圓, 也就是:

圖片描述

在open_cv中通常經過霍夫梯度法來解決圓變換問題,原理以下:

  • 首先對圖像應用邊緣檢測,用canny邊緣檢測。
  • 而後,對邊緣圖像中的每個非零點,考慮其局部梯度,即用Sobel()函數計算x和y方向的Sobel一階導數獲得梯度
  • 利用獲得的梯度,由斜率指定的直線上的每個點都在累加器中被累加,這裏的斜率是從一個指定的最小值到指定的最大值的距離
  • 標記邊緣圖像中每個非0像素的位置
  • 從二維累加器中這些點中選擇候選的中心,這些中心都大於給定閾值而且大於其全部近鄰。這些候選的中心按照累加值降序排列,以便於最支持像素的中心首先出現
  • 對每個中心,考慮全部的非0像素
  • 這些像素按照其與中心的距離排序,從到最大半徑的最小距離算起,選擇非0像素最支持的一條半徑
  • 若是一箇中心收到邊緣圖像非0像素最充分的支持,而且到前期被選擇的中心有足夠的距離,那麼它就會被保留下來

這個實現可使算法執行起來更高效,或許更加劇要的是,可以幫助解決三維累加器中會產生許多噪聲而且使得結果不穩定的稀疏分佈問題,但該算法一樣不完美。

在程序中使用的函數爲HoughCircles(),使用此函數能夠很容易地檢測出圓的圓心,可是它可能找不到合適的圓半徑

圖片描述

經過以上這幾步,基本能在一張圖片中找到交通標誌牌的位置了,下面是示例效果:

A.原圖

圖片描述

B.提取顏色區域後
圖片描述

[如圖所示,代碼中所要實現的提取紅藍黃區域已經實現,而不足之處在於,無關的區域也被提取了進來,例如藍色的天空,紅色的交通柱,以及少部分綠葉和車輛輪廓,但對於識別交通標誌顏色而言是沒有影響的]

C.邊緣檢測

圖片描述

[該圖是對提取顏色區域後的圖進行了邊緣檢測,清晰地把交通標誌牌和其它的一些圖片輪廓給勾勒出來。這近一步地方便了下一步進行圓變換的操做]

D.霍夫圓變換

圖片描述

[在對邊緣檢測後的圖進行了高斯濾波去噪以後,對圖片進行了HoughCircles()的操做,能夠看出,交通標誌的位置被很準確地勾勒出來]

相關文章
相關標籤/搜索