资源简介
使用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
- 上一篇:从零开始学习SVM
- 下一篇:hog_svm_train_python
评论
共有 条评论