车牌定位为什么只定位一半呐

小饼子哈哈哈哈 2018-03-01 04:13:29
本人对车牌识别感兴趣,目前在自我学习。最近参考网上代码后发现车牌定位有错误,但由于是菜鸟一只,并没找到原因。是参数设置问题呐?还是代码有错?希望各位大神帮忙解答解答,衷心感谢。
附代码:
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)
cv2.imshow("binary",binary)
# 膨胀和腐蚀操作的核函数
element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 1))
element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (8, 6))
# 膨胀一次,让轮廓突出
dilation = cv2.dilate(binary, element2, iterations=1)
# 腐蚀一次,去掉细节
erosion = cv2.erode(dilation, element1, iterations=1)
# 再次膨胀,让轮廓明显一些
dilation2 = cv2.dilate(erosion, element2, iterations=3)
cv2.imshow('dilation2', dilation2)
cv2.waitKey(0)
return dilation2


def findPlateNumberRegion(img):
region = []
# 查找轮廓
binary,contours, hierarchy = 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(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)

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

# box是四个点的坐标
box = cv2.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 = '6.jpg'
img = cv2.imread(imagePath)
detect(img)
运行结果:
...全文
679 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
虾米馅煎包 2018-03-02
  • 打赏
  • 举报
回复
或许你的这个代码只截取数字部分,你可以多试试。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧