Qt+OpenCv实现车牌定位(Windows10)

  • 最近这段时间需要进行图片方面的处理,众所周知,OpenCv是开源圈里几乎最优秀的计算机视觉处理库,本文记录在研究过程中所做的一个车牌定位的Demo。
    本文所提供的Demo仅限于车牌定位,定位出的车牌进行识别的话可以使用TeseRact进行,本文不做更多描述。

工具准备

Qt

  • Qt的安装网上有大量的教程,或许之后本人会出一个相关的文章,不过在这里就只放一个下载的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的统筹文件"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);     //合并检查结果

8.图像二值化处理

    cvtColor(dealImage,dealImage,COLOR_BGR2GRAY);           //转为灰度图像
    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.获取车牌区域(截取车牌范围的算法可自行判断设计)

    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)       //获取最大面积的区域,即车牌区域
    {
        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)         //是否获取到区域
    {
        /*描绘最大区域的轮廓*/
        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));
        }

        /*描绘最大区域的矩形形态*/
        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中所提供的代码是经过本人亲测有效的,不过考虑到汽车图像的各种情况不同,定位效果不做保证,如果希望进行汽车图像车牌的复杂环境多种类型都可以定位的话,需要依靠机器学习的模型来进行,本文只是提供一种车牌定位的实现,后面有机会再分享机器模型的创建以及训练

  1. 我将OpenCv的库文件编译成了一个文件,所以在LIBS中只添加了一个lib,如果不是这种情况,需要将所有lib都添加进来

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336