• 大小: 1.61MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-08-31
  • 语言: Python
  • 标签: 车牌定位  

资源简介

使用python进行图片中车牌的定位,并用绿色线条标识,各位可以在这个基础上进行改进

资源截图

代码片段和文件信息

# -*- coding: utf-8 -*-
# @Author: hyzhangyong
# @Date:   2016-06-23 16:21:54
# @Last Modified by:   hyzhangyong
# @Last Modified time: 2016-06-24 00:00:47
import sys
import cv2
import numpy as np

def preprocess(gray):
# # 直方图均衡化
# equ = cv2.equalizeHist(gray)
# 高斯平滑
gaussian = cv2.GaussianBlur(gray (3 3) 0 0 cv2.BORDER_DEFAULT)
# 中值滤波
median = cv2.medianBlur(gaussian 5)
# Sobel算子,X方向求梯度
sobel = cv2.Sobel(median cv2.CV_8U 1 0 ksize = 3)
# 二值化
ret binary = cv2.threshold(sobel 170 255 cv2.THRESH_BINARY)
# 膨胀和腐蚀操作的核函数
element1 = cv2.getStructuringElement(cv2.MORPH_RECT (9 1))
element2 = cv2.getStructuringElement(cv2.MORPH_RECT (9 7))
# 膨胀一次,让轮廓突出
dilation = cv2.dilate(binary element2 iterations = 1)
# 腐蚀一次,去掉细节
erosion = cv2.erode(dilation element1 iterations = 1)
# 再次膨胀,让轮廓明显一些
dilation2 = cv2.dilate(erosion element2iterations = 3)
cv2.imshow(‘dilation2‘dilation2)
cv2.waitKey(0)
return dilation2

def findPlateNumberRegion(img):
region = []
# 查找轮廓
contourshierarchy = cv2.findContours(img cv2.RETR_TREE cv2.CHAIN_APPROX_SIMPLE)

# 筛选面积小的
for i in range(len(contours)):
cnt = contours[i]
# 计算该轮廓的面积
area = cv2.contourArea(cnt)

# 面积小的都筛选掉
if (area < 2000):
continue

# 轮廓近似,作用很小
epsilon = 0.001 * cv2.arcLength(cntTrue)
approx = cv2.approxPolyDP(cnt epsilon True)

# 找到最小的矩形,该矩形可能有方向
rect = cv2.minAreaRect(cnt)
print “rect is: “
print rect

# box是四个点的坐标
box = cv2.cv.BoxPoints(rect)
box = np.int0(box)

# 计算高和宽
height = abs(box[0][1] - box[2][1])
width = abs(box[0][0] - box[2][0])
# 车牌正常情况下长高比在2.7-5之间
ratio =float(width) / float(height)
print ratio
if (ratio > 5 or ratio < 2):
continue
region.append(box)

return region

def detect(img):
# 转化成灰度图
gray = cv2.cvtColor(img cv2.COLOR_BGR2GRAY)

# 形态学变换的预处理
dilation = preprocess(gray)

# 查找车牌区域
region = findPlateNumberRegion(dilation)

# 用绿线画出这些找到的轮廓
for box in region:
cv2.drawContours(img [box] 0 (0 255 0) 2)
ys = [box[0 1] box[1 1] box[2 1] box[3 1]]
xs = [box[0 0] box[1 0] box[2 0] box[3 0]]
ys_sorted_index = np.argsort(ys)
xs_sorted_index = np.argsort(xs)

x1 = box[xs_sorted_index[0] 0]
x2 = box[xs_sorted_index[3] 0]

y1 = box[ys_sorted_index[0] 1]
y2 = box[ys_sorted_index[3] 1]

img_org2 = img.copy()
img_plate = img_org2[y1:y2 x1:x2]
cv2.imshow(‘number plate‘ img_plate)
cv2.imwrite(‘number_plate.jpg‘ img_plate)

cv2.namedWindow(‘img‘ cv2.WINDOW_NORMAL)
cv2.imshow(‘img‘ img)

# 带轮廓的图片
cv2.imwrite(‘contours.png‘ img)

cv2.waitKey(0)
cv2.destroyAllWindows()


if __name__ == ‘__main__‘:
imagePath = ‘10.jpg‘
img = cv2.imread(imagePath)
detect(img)

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2016-06-23 16:40  platenumber-master\
     文件       99321  2016-06-23 16:40  platenumber-master\1.jpg
     文件       94949  2016-06-23 16:40  platenumber-master\10.jpg
     文件       39908  2016-06-23 16:40  platenumber-master\2.jpg
     文件      176113  2016-06-23 16:40  platenumber-master\3.jpg
     文件       34077  2016-06-23 16:40  platenumber-master\4.jpg
     文件      303926  2016-06-23 16:40  platenumber-master\5.jpg
     文件      130229  2016-06-23 16:40  platenumber-master\6.jpg
     文件       39518  2016-06-23 16:40  platenumber-master\7.jpg
     文件       11179  2016-06-23 16:40  platenumber-master\8.jpg
     文件      135264  2016-06-23 16:40  platenumber-master\9.jpg
     文件          60  2016-06-23 16:40  platenumber-master\README.md
     文件      525484  2016-06-23 16:40  platenumber-master\contours.png
     文件       11180  2016-06-23 16:40  platenumber-master\number_plate.jpg
     文件       90527  2016-06-23 16:40  platenumber-master\plate-number.jpg
     文件        3062  2016-06-23 16:40  platenumber-master\platenumber.py

评论

共有 条评论