Qt+OpenCv實現(xiàn)車牌定位(Windows10)

  • 最近這段時間需要進行圖片方面的處理涛碑,眾所周知精堕,OpenCv是開源圈里幾乎最優(yōu)秀的計算機視覺處理庫,本文記錄在研究過程中所做的一個車牌定位的Demo蒲障。
    本文所提供的Demo僅限于車牌定位歹篓,定位出的車牌進行識別的話可以使用TeseRact進行,本文不做更多描述揉阎。

工具準備

Qt

  • Qt的安裝網(wǎng)上有大量的教程庄撮,或許之后本人會出一個相關(guān)的文章,不過在這里就只放一個下載的Link好了
    http://download.qt.io/archive/qt/

OpenCv庫文件

  • OpenCv在Windows下配合Qt的使用需要對源碼進行重新編譯毙籽,我所使用的是最新的4.3版本,放個下載連接以及安裝編譯教程
  • OpenCv下載
  • OpenCv安裝視頻教程windows
  • 如果各位覺得上述操作太麻煩我這里提供一個我自己編譯出來的OpenCv4.3的lib

Demo

1.新建一個Qt的項目
2.Pro文件中需添加OpenCv庫的頭文件路徑以及lib路徑[1]

INCLUDEPATH += C:\Users\houxia2x\Desktop\Asa\opencv\opencv\asa_build\install\include\opencv2\
               C:\Users\houxia2x\Desktop\Asa\opencv\opencv\asa_build\install\include

LIBS += -LC:\Users\houxia2x\Desktop\Asa\opencv\opencv\asa_build\install\x64\mingw\bin\
        -llibopencv_world430

3.頭文件需包含OpenCv的統(tǒng)籌文件"opencv2/opencv.hpp"

#include "opencv2/opencv.hpp"

4.加載命名空間

using namespace cv;

5.加載圖片

Mat srcImage = imread(path);
if(srcImage.empty())
{
    cout<<"load pic failed";
    return;
}

6.對圖片進行高斯模糊處理(圖像平滑處理)

Mat dealImage = srcImage.clone();
GaussianBlur(srcImage,dealImage,Size(3,3),0);

7.邊緣檢查

    Mat h_filler,v_filler,abs_h_filler,abs_v_filler;
    Sobel(dealImage,h_filler,CV_16S,1,0,3,1,0,BORDER_DEFAULT);      //橫向檢查
    convertScaleAbs(h_filler,abs_h_filler);
    Sobel(dealImage,v_filler,CV_16S,0,1,3,1,0,BORDER_DEFAULT);      //縱向檢查
    convertScaleAbs(v_filler,abs_v_filler);
    addWeighted(abs_h_filler,0.5,abs_v_filler,0.5,0,dealImage);     //合并檢查結(jié)果

8.圖像二值化處理

    cvtColor(dealImage,dealImage,COLOR_BGR2GRAY);           //轉(zhuǎn)為灰度圖像
    threshold(dealImage,dealImage,95,255,THRESH_BINARY);    //二值化

9.圖像補全處理

    Mat element = getStructuringElement(MORPH_RECT,Size(25,25));    //核陣列
    vector<vector<Point>> vec_count;
    morphologyEx(dealImage,dealImage,MORPH_CLOSE,element);          //閉運算(膨脹--腐蝕)
    morphologyEx(dealImage,dealImage,MORPH_OPEN,element);           //開運算(腐蝕--膨脹)

10.獲取車牌區(qū)域(截取車牌范圍的算法可自行判斷設(shè)計)

    vector<vector<Point>> vec_area;
    findContours(dealImage,vec_area,RETR_EXTERNAL,CHAIN_APPROX_NONE);
    vector<Point> max_point_area;
    size_t num_max = 0;
    Point2f tmp_rect[4];
    for(size_t i = 0 ; i < vec_area.size() ; ++i)       //獲取最大面積的區(qū)域洞斯,即車牌區(qū)域
    {
        minAreaRect(vec_area[i]).points(tmp_rect);
        double width = powf((tmp_rect[0].x - tmp_rect[1].x), 2) + powf((tmp_rect[0].y - tmp_rect[1].y), 2);
        width = sqrt(width);
        double height = powf((tmp_rect[0].x - tmp_rect[3].x), 2) + powf((tmp_rect[0].y - tmp_rect[3].y), 2);
        height = sqrt(height);
        if(height*width > num_max)
        {
            num_max = height*width;
            max_point_area = vec_area[i];
        }
    }
    if(num_max > 0)         //是否獲取到區(qū)域
    {
        /*描繪最大區(qū)域的輪廓*/
        Mat carPlateAreaImage = srcImage.clone();
        for(size_t i = 0 ; i < max_point_area.size() ; ++i)
        {
            circle(carPlateAreaImage,max_point_area.at(i),2,Scalar(255,0,0));
        }

        /*描繪最大區(qū)域的矩形形態(tài)*/
        Point2f max_rect_corner_point[4];
        RotatedRect max_rect = minAreaRect(max_point_area);
        max_rect.points(max_rect_corner_point);
        for(size_t j = 0 ; j < 4 ; ++j)
        {
            line(carPlateAreaImage,max_rect_corner_point[j],max_rect_corner_point[(j+1)%4],Scalar(0,0,255),3);
        }
        //        imshow("carPlateAreaImage image",carPlateAreaImage);

        Mat carPlateImage = Mat(srcImage,max_rect.boundingRect());
        imshow("carPlateImage image",carPlateImage);
    }else{
        cout<<"Fail for fetch area of car plate";
    }

Note

  • Demo中所提供的代碼是經(jīng)過本人親測有效的,不過考慮到汽車圖像的各種情況不同惧财,定位效果不做保證巡扇,如果希望進行汽車圖像車牌的復(fù)雜環(huán)境多種類型都可以定位的話,需要依靠機器學(xué)習的模型來進行垮衷,本文只是提供一種車牌定位的實現(xiàn)厅翔,后面有機會再分享機器模型的創(chuàng)建以及訓(xùn)練

  1. 我將OpenCv的庫文件編譯成了一個文件,所以在LIBS中只添加了一個lib搀突,如果不是這種情況刀闷,需要將所有l(wèi)ib都添加進來 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仰迁,隨后出現(xiàn)的幾起案子甸昏,更是在濱河造成了極大的恐慌,老刑警劉巖徐许,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件施蜜,死亡現(xiàn)場離奇詭異,居然都是意外死亡雌隅,警方通過查閱死者的電腦和手機翻默,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門缸沃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人修械,你說我怎么就攤上這事趾牧。” “怎么了肯污?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵翘单,是天一觀的道長。 經(jīng)常有香客問我蹦渣,道長哄芜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任柬唯,我火速辦了婚禮忠烛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘权逗。我一直安慰自己,他們只是感情好冤议,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布斟薇。 她就那樣靜靜地躺著,像睡著了一般恕酸。 火紅的嫁衣襯著肌膚如雪堪滨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天蕊温,我揣著相機與錄音袱箱,去河邊找鬼。 笑死义矛,一個胖子當著我的面吹牛发笔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凉翻,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼了讨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了制轰?” 一聲冷哼從身側(cè)響起前计,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎垃杖,沒想到半個月后男杈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡调俘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年伶棒,在試婚紗的時候發(fā)現(xiàn)自己被綠了旺垒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡苞冯,死狀恐怖袖牙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舅锄,我是刑警寧澤鞭达,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站皇忿,受9級特大地震影響畴蹭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鳍烁,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一叨襟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幔荒,春花似錦糊闽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姚垃,卻和暖如春念链,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背积糯。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工掂墓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人看成。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓君编,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绍昂。 傳聞我的和親對象是個殘疾皇子啦粹,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355