2023年12月8日发(作者:老捷达王)

车牌定位html5,车牌识别(一)——车牌定位(附详细代码及

注释)

车牌识别分三步:车牌定位,车牌字符分割,车牌字符识别。

本篇就车牌定位进行讲述。车牌定位顾名思义——找出车牌的位置。如何实现,又分三步:图像预处理,数学形态学粗定位,长宽比例精确

定位。

首先,对图像预处理:

彩色图像转灰度图

高斯滤波,中值滤波

边缘化检测

二值化操作

#-*- coding: utf-8 -*-

import cv2

import numpy as np

def Process(img):

# 高斯平滑

gaussian = anBlur(img, (3, 3), 0, 0, _DEFAULT)

#anBlur(src,ksize,sigmaX[,sigmaxY[,borderType]]])高斯滤波函数

#src: 输入图像

#ksize: 高斯内核大小,元组类型

#sigmaX: 高斯核函数在X方向上的标准偏差

#sigmaY: 高斯核函数在Y方向上的标准偏差,如果sigmaY是0,则函数会自动将sigmaY的值设置为与sigmaX相同的值,如果sigmaX和

sigmaY都是0,这两个值将由ksize[0]和ksize[1]计算而来。建议将size、sigmaX和sigmaY都指定出来。

#borderType: 推断图像外部像素的某种便捷模式,有默认值_DEFAULT,如果没有特殊需要不用更改,具体可以参考

borderInterpolate()函数。

# 中值滤波

median = Blur(gaussian, 5)

#Blur(src,ksize)

#src: 输入图像

#ksize: 高斯内核大小,元组类型

# Sobel算子

# 梯度方向: x

sobel = (median, _8U, 1, 0, ksize=3)

# 利用Sobel方法可以进行sobel边缘检测

# img表示源图像,即进行边缘检测的图像# 图像深度是_8U、_16U、_16S、_32F以及_64F其中的某一个

# 第三和第四个参数分别是对X和Y方向的导数(即dx,dy),对于图像来说就是差分,这里1表示对X求偏导(差分),0表示不对Y求导(差分)。

其中,X还可以求2次导。

# 注意:对X求导就是检测X方向上是否有边缘。

# 第五个参数ksize是指核的大小。

# 这里说明一下,这个参数的前四个参数都没有给谁赋值,而ksize则是被赋值的对象

# 实际上,这是可省略的参数,而前四个是不可省的参数。注意其中的不同点值化

ret, binary = old(sobel, 170, 255, _BINARY)

#灰度值小于175的点置0,灰度值大于175的点置255

#最后的参数是阈值类型,对应一个公式,一般用这个就可以

然后,数学形态学处理: 形态学处理的核心就是定义结构元素,一般情况下对二值化图像进行的操作。

# 膨胀和腐蚀操作的核函数

element1 = ucturingElement(_RECT, (9, 1))

element2 = ucturingElement(_RECT, (9, 7))

#第一个参数定义结构元素,如椭圆(MORPH_ELLIPSE)、交叉形结构(MORPH_CROSS)和矩形(MORPH_RECT)

#第二个参数就是指和函数的size,9×1

# 膨胀一次,让轮廓突出

dilation = (binary, element2, iterations=1)

# 腐蚀一次,去掉细小杂点

erosion = (dilation, element1, iterations=1)

# 再次膨胀,让轮廓更明显

dilation2 = (erosion, element2, iterations=3)

#存储中间图片

e(\"\", binary)

e(\"\", dilation)

e(\"\", erosion)

e(\"\", dilation2)

return dilation2

最后:查找轮廓,精确定位

查找筛选轮廓

车牌长宽比

颜色判断(没大必要)

def GetRegion(img):

regions = []# 查找轮廓

_, contours, hierarchy = ntours(img, _TREE, _APPROX_SIMPLE)

#三个输入参数:输入图像(二值图像),轮廓检索方式,轮廓近似方法

#轮廓检索方式:_EXTERNAL只检测外轮廓。_LIST检测的轮廓不建立等级关系。_CCOMP建立两个等级

的轮廓,上面一层为外边界,里面一层为内孔的边界信息。_TREE建立一个等级树结构的轮廓

#轮廓近似方法:_APPROX_NONE存储所有边界点。_APPROX_SIMPLE压缩垂直、水平、对角方向,只保留端

点。_APPROX_TX89_L1使用teh-Chini近似算法。_APPROX_TC89_KCOS使用teh-Chini近似算法

#三个返回值:图像,轮廓,轮廓的层析结构

#筛选面积小的

for contour in contours:

#计算该轮廓的面积

area = rArea(contour)

#面积小的都筛选掉

if (area < 2000):

continue

#轮廓近似,作用很小

epslion = 1e-3 * gth(contour, True)

approx = PolyDP(contour, epslion, True)

#epsilon,是从轮廓到近似轮廓的最大距离。是一个准确率参数,好的epsilon的选择可以得到正确的输出。True决定曲线是否闭合。

# 找到最小的矩形,该矩形可能有方向

rect = aRect(contour)

# box是四个点的坐标

box = nts(rect)

box = 0(box)

## 计算高和宽

height = abs(box[0][1] - box[2][1])

width = abs(box[0][0] - box[2][0])

#车牌正常情况下长高比在2-5之间

ratio =float(width) / float(height)

if (ratio < 5 and ratio > 2):

(box)

return regions

def detect(img):

# 灰度化

gray = or(img, _BGR2GRAY)# 预处理及形态学处理,得到可以查找矩形的图片

prc = Process(gray)

#得到车牌轮廓

regions = GetRegion(prc)

print(\'[INFO]:Detect %d license plates\' % len(regions))

#用绿线画出这些找到的轮廓

for box in regions:

ntours(img, [box], 0, (0, 255, 0), 2)

#五个输入参数:原始图像,轮廓,轮廓的索引(当设置为-1时,绘制所有轮廓),画笔颜色,画笔大小

#一个返回值:返回绘制了轮廓的图像

(\'Result\', img)

#保存结果文件名

e(\'\', img)

y(0)

yAllWindows()

if __name__ == \'__main__\':

#输入的参数为图片的路径

img = (\'\')

detect(img)

更多推荐

轮廓,图像,车牌,参数,定位