车牌识别(一)-车牌定位

在对车牌识别过程中,常用的方法有:基于形状、基于色调、基于纹理、基于文字特征等方法。首先基于形状,在车牌中因为车牌为形状规格的矩形,所以目的转化为寻找矩形特征,常常是利用车牌长宽比例特征、占据图像的比例等。基于色调,国内的车牌往往是蓝底白字,可以采用图像的色调或者饱和度特征,进入生成二值图,定位车牌位置。基于纹理特征自己还没有基础到。基于文字特征往往是根据文字轮廓特征进行识别,原理是基于相邻文字轮廓特征、比例进行定位车牌位置。

一、图像二值化

正如前面文章所言,首先进行获取图像二值化特征,本文采取了根据图像亮度特征,提高对比度,进行可以清晰获取文字的图像,为下一步的文字轮廓识别打好基础。

1.1 算法流程

伪代码

1、图像转化为HSV图像,获取V通道图像

2、提高对比度

3、V图像高斯滤波,去除噪声

4、图像二值化

程序源码:

def get_colorvalue(image):
    height, width, shape = image.shape
    image_hsv = np.zeros((height,width), np.uint8)
    image_hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
    image_hue, image_saturation, image_value = cv2.split(image_hsv)
    return image_value

def enhance_contrast(image):
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
    img_tophat = cv2.morphologyEx(image, cv2.MORPH_TOPHAT,kernel)
    img_blackhat = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel)

    image_plus_tophat = cv2.add(image, img_tophat)
    image_plus_blackhat_minus_blackhat = cv2.subtract(image_plus_tophat, img_blackhat)
return image_plus_blackhat_minus_blackhat

def preprocess(srcimage):

    image_value = get_colorvalue(srcimage)
    image_enhance = enhance_contrast(image_value)

    image_blur = cv2.GaussianBlur(image_enhance, (5,5), 0)
#    _, image_binary = cv2.threshold(image_blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    _, image_binary = cv2.threshold(image_blur, 100, 255, cv2.THRESH_BINARY )

    cv2.imwrite(‘image_binary.png‘,image_binary)

    return  image_binary

1.2 算法分析

在实验中在获取通道图像时,发现可以利用图像饱和度图像进行定位。

1、通道图像提取

image_hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
image_hue, image_saturation, image_value = cv2.split(image_hsv)

上面分别为src、hue、saturation、value四副图像,在其中saturatio中可以清晰获取车牌相对于背景的饱和度大,则提取较value图像则可视为灰度图像,能保留图像大部分图像特征。

关于hsv的介绍可以参考这篇文章学习Opencv笔记(二)————hsv色系:文章简单介绍hsv体系内容。

2、图像对比度增强

    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
    img_tophat = cv2.morphologyEx(image, cv2.MORPH_TOPHAT,kernel)
    img_blackhat = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel)

    image_plus_black = cv2.add(image, img_blackhat)
    image_plus_blackhat_minus_blackhat = cv2.subtract(image_plus_black, img_tophat)

(img_tophat)                                                                               (img_blackhat)

                              (ima_plus_top_hat)                                                                                 (img_plus_black_top_hat)

图像增强的目的是提高图像的对比度,亮度地方更亮,暗的地方更暗。在形态学处理中,顶帽操作往往用来分离比邻近点亮一些的板块,在一幅图像具有大幅背景而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,这一操作也与选择的核尺寸有关。

流程就是,加上黑帽,减去顶冒,其实通过实验结果发现,貌似作用不大。

形态学处理详细介绍可以参考:数字图像处理-形态学研究:对形态学各种操作和理论进行了详细的介绍

3.二值化

在获取单通道图像后,进行了图像二值化操作,其中网上有个文章推荐使用adaptiveThreshold,其实真的不好用,我也采用了ostu算法,经过试验验证也不是很好用,经过多次验证,初步定阈值为80,效果比较良好。

二、图像位置初步定位

由于车辆图像背景比较复杂,所以应该根据车牌的特征进行初次筛选,其特征还是根据中国车牌大小、比例等关系进行筛选。

上图是自己找的关于车牌的标准,我们可以清晰知道宽:高 = 3.5 所以程序设置的最小比例是2,最大是5,然后就是根据图像大小设定的面积,长宽等大小。

2.1、算法源码

#contants for plate contour
MIN_CONTOUR_WIDTH = 80
MIN_CONTOUR_HEIGHT = 30

MIN_CONTOUR_RATIO = 1.5
MAX_CONTOUR_RATIO = 5

MIN_CONTOURL_AREA = 1500

def get_external_contours(image_thresh):
    #    Construct display images and display contours in images

    height, width = image_thresh.shape
    image_contour1 = np.zeros((height, width),np.uint8)
    image_contour2 = np.zeros((height, width),np.uint8) 

##    Custom 3*3 nuclei undergo expansion corrosion in the X direction
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    image_dilate= cv2.dilate(image_thresh,kernel,iterations =2)
    image_erode= cv2.erode(image_dilate, kernel, iterations = 4)
    image_dilate= cv2.dilate(image_erode,kernel,iterations = 2)
#
    _, contours, hierarchy = cv2.findContours(image_dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    contour_filter = []
    cv2.drawContours(image_contour1, contours, -1,(255, 255, 255 ),3)

#    choose the suite contour by the feature of special scence
    for contour in contours:
        contour_possible = PossibleContour(contour)
        if(check_external_contour(contour_possible)):
            cv2.rectangle(image_contour2, (contour_possible.rectX, contour_possible.rectY),
                                      (contour_possible.rectX + contour_possible.rectWidth, contour_possible.rectY + contour_possible.rectHeight),255)
            contour_filter.append(contour_possible)

    print("the length of origin contours is %d " %len(contour_filter))
    cv2.imwrite("1_1contours.png",image_contour1)
    cv2.imwrite("1_2contours.png",image_contour2)
    return contour_filter

#    #According to the license plate area size, length and width ratio, the primary screening is carried out
def check_external_contour(contour):
    if (contour.area > MIN_CONTOURL_AREA and contour.rectWidth > MIN_CONTOUR_WIDTH and contour.rectHeight > MIN_CONTOUR_HEIGHT
        and contour.whratio > MIN_CONTOUR_RATIO and contour.whratio < MAX_CONTOUR_RATIO):
        return True
    else:
        return False

2 .2、算法分析

上述算法核心是利用了findcontours函数,即在图像中寻找目标轮廓,详细的介绍可以参考这篇文章:

OpenCV-Python教程(11、轮廓检测):文中很详细介绍函数参数含义及应用

在获取轮廓中,传入自己定义的类中,获取根据轮廓的矩形的面积、长宽等值,方便后续计算。

第二步就是根据上述理论分析,得到的函数。

上面四副图片分别展示了经过筛选后的结果,对contour根据限制条件进行选择,最终选择符合条件的候选区域,并保存在list中。

三、图像车牌精确定位

在中国车牌颜色为蓝底白字,所以蓝色数值会比较大,我们计算候选车牌区域蓝色数值(均值)的最大值,确定最终的车牌区域。

3.1 算法源码

def chack_plate_blueHue(contour_list, image_src):
    if len(contour_list) == 0:
        print(‘cannot find the plate contours‘)
        return None
    mean_list = []

#    calculate the mean of each blue image and choose the max one,get the index
    for contour in contour_list:
        image = cv2.getRectSubPix(image_src, ( contour.rectWidth, contour.rectHeight),(contour.centerX, contour.centerY))
        b , g, r = cv2.split(image)
        sum_pix = b.shape[0] * b.shape[1]
        b_mean = np.sum(np.array(b))/sum_pix
        mean_list.append(b_mean)

    index = np.argmax(np.array(mean_list))
    contour_final = contour_list[index]

    return contour_final

3.2 算法分析

1、遍历轮廓数组,根据前期获取的候选车牌区域,通过getRectSubPix获取其图像

2、分离图像,获取blue通道图像

3、计算图像均值,并添加到list

4、寻找list的argmax,获取其index

5、返回list中准确的contour

时间: 2024-10-11 12:52:31

车牌识别(一)-车牌定位的相关文章

车牌识别 api接口车牌识别 SDK车牌识别OCR

整牌识别率高达99.7%,尤其汉字识别遥遥领先同类产品:2. 识别速度快,极致优化的车牌定位和识别算法;3. 支持牌照全,包括蓝牌.黄牌.挂车号牌.新军牌.警牌.新武警车牌.教练车牌.大使馆车牌.农用车牌.个性化车牌.港澳出入境车牌.澳台车牌.民航车牌.领馆车牌.新能源车牌等4. 车牌宽度要求低,车牌宽度≥60个像素,都不影响识别:5. 完美支持安卓系统,ios系统,支持手机ARM平台和PDA的X86架构:6.支持视频识别和拍照识别两种识别模式 移动端车牌识别技术参数 车牌识别 api接口车牌识

OpenCV学习之路——车牌识别之车牌定位

去年七月份因为学校项目需要开始接触图像处理,但那时候只是到网上找车牌识别代码,然后加入到自己的项目中,不清楚细节原理. 现在自己重新一步步实现车牌识别. 高斯模糊: 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 } 灰度化: 1 Mat Grayscale(Mat &img) { 2 Mat out;

车牌识别中车牌信息以及如何做车牌识别的思路整理

一.现在的国内民用车牌都是92式车牌. 其车牌的一些参数指标如下: A:总长度为440mm: B:高度为140mm: C:其中单字符的宽为45mm: D:整个车牌区域字符长度为409mm(这里在后面计算的时候方便都认为是410mm): E:字符的高度为90mm: F:第二和第三个字符之间的距离为34mm: G:其他的每两个字符之间的距离为12mm: H:其中如果出现字符"1"的话,字符“1”的宽度为13.5mm:与其他字符的相差22.5mm:两个“1”之间的距离为38.5mm: 下图为

移动端车牌识别|前端车牌识别|车牌识别前端识别

移动端前端车牌识别OCR技术是为促进人工智能化建设研发而来的SDK应用.此应用基于Android.ios平台,手机.PDA.安卓系统带200万像素以上的摄像头均适用,该移动端前端车牌识别技术sdk.Android平台提供Jar包,IOS平台提供.a静态库,从拍照识别车牌为基础,一步步研发出并且是首创出视频流OCR识别,像要像扫二维码那样去识别车牌.此OCR软件对车牌颜色.车牌号进行识别. 目前很多地方都会用到移动端前端车牌识别OCR技术,停车场出入口.路边停车.汽车保养维修.尤其是移动警务等,无

车牌识别01__车牌抠图(CNN深度学习—opencv实现方法)

一.安装依赖 1.mac安装brem /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"2.mac安装opencvbrew install opencv3.安装opencv-pythonpip3.6 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python参考以下地址h

车牌识别:安防机器人车库巡逻的最佳搭档

关键词:车牌识别,车牌识别软件,PC端车牌识别,Windows车牌识别,Linux车牌识别,移动端车牌识别,手机端车牌识别,Android车牌识别,iOS车牌识别 安防机器人又称安保机器人,是半自主.自主或者在人类完全控制下协助人类完成安全防护工作的机器人.安防机器人作为机器人行业的一个细分领域,立足于实际生产生活需要,用来解决安全隐患.巡逻监控及灾情预警等.从而减少安全事故的发生,减少生命财产损失.今天我们就以地下车库巡逻为例讲一下安防机器人使用吧! 安全一直都是居民生活.公司企业生产首先要考

PC端/服务器端(云端)/移动端车牌识别SDK技术介绍

关键词:车牌识别 PC端车牌识别 服务器端车牌识别 云端车牌识别 移动端车牌识别 车牌识别SDK PC端车牌识别SDK  PC端车牌识别SDK是北京易泊时代自主研发的车牌识别SDK,在智能交通系统.出入口管理系统.公安图帧系统.移动警务系统等多种行业都已实现成功运用.PC端车牌识别SDK融合了车牌定位.车牌字符切分.车牌字符识别等算法,使该系统具有识别效率高.速度快.适应性强.使用方便等优势,技术处于国际先进水平,在相关行业领域得到用户的广泛好评. PC端车牌识别产品形态:加密锁.车牌识别SDK

移动端车牌识别sdk-手机拍照识别车牌技术

关键词 移动车牌识别.安卓车牌识别.车牌识别sdk.移动端车牌识别sdk 手机拍照识别车牌技术原理 手机拍照识别车牌是指通过计算机视觉.图像处理与模式识别等方法从车辆图像中提取车牌字符信息,从而确定车辆身份的技术.手机拍照识别车牌分为车牌定位.字符分割.字符识别三大部分.车牌区域在整幅图像中所占比例很小,车牌的颜色.大小.位置也不确定,并且定位算法要能够克服不同光照和复杂背景的影响,还要兼顾准确性和实时性,因此快速准确的定位车牌是比较困难的. 手机拍照识别车牌技术的识别率在白天能达到99%以上,

车牌识别停车场计费系统的工作原理解析

今天主要来分享下车牌识别以及车牌识别停车计费系统的一些知识. 关键核心:车牌识别.停车场计费系统.停车管理系统.OCR识别 一.首先那停车收费系统由哪些组成的呢? 从产品形态上来看停车收费系统由软件(车牌识别.计费系统)和硬件(相机.立柱.显示屏.道闸.地感等)这两方面来组成. 1.车牌识别软件系统 车牌识别系统(Vehicle License Plate Recognition,VLPR) 是指能够检测到受监控路面的车辆并自动提取车辆牌照信息(含汉字字符.英文字母.阿拉伯数字及号牌颜色)进行处

一种基于Android、iOS系统的移动端车牌识别技术,实现轻APP本地扫描识别车牌号

随着移动互联及移动终端的普及,OCR技术在移动端得到很好地应用,基于OCR技术开发出的移动端车牌识别SDK可以直接对汽车的车牌进行识别录入,替代原来的手工记录,然后再人工录入电脑的步骤,让车牌的识别.记录工作变得快捷.便利.准确,会给业务人员带来很大的便利.下面简单介绍一下移动端车牌识别技术: 移动端车牌识别技术是指通过计算机视觉.图像处理与模式识别等方法从车辆图像中提取车牌字符信息,从而确定车辆身份的技术.移动端车牌识别技术分为车牌定位.字符分割.字符识别三大部分.车牌区域在整幅图像中所占比例