python+opencv实现车牌定位功能(实例代码)


Posted in Python onDecember 24, 2019

写在前面

HIT大三上学期视听觉信号处理课程中视觉部分的实验三,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验三。

由于时间紧张,代码没有进行任何优化,实验算法仅供参考。

实验要求

对给定的车牌进行车牌识别

实验代码

代码首先贴在这里,仅供参考

源代码

实验代码如下:

import cv2
import numpy as np
def lpr(filename):
  img = cv2.imread(filename)
  # 预处理,包括灰度处理,高斯滤波平滑处理,Sobel提取边界,图像二值化
  # 对于高斯滤波函数的参数设置,第四个参数设为零,表示不计算y方向的梯度,原因是车牌上的数字在竖方向较长,重点在于得到竖方向的边界
  # 对于二值化函数的参数设置,第二个参数设为127,是二值化的阈值,是一个经验值
  gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
  GaussianBlur_img = cv2.GaussianBlur(gray_img, (3, 3), 0)
  Sobel_img = cv2.Sobel(GaussianBlur_img, -1, 1, 0, ksize=3)
  ret, binary_img = cv2.threshold(Sobel_img, 127, 255, cv2.THRESH_BINARY)
  # 形态学运算
  kernel = np.ones((5, 15), np.uint8)
  # 先闭运算将车牌数字部分连接,再开运算将不是块状的或是较小的部分去掉
  close_img = cv2.morphologyEx(binary_img, cv2.MORPH_CLOSE, kernel)
  open_img = cv2.morphologyEx(close_img, cv2.MORPH_OPEN, kernel)
  # kernel2 = np.ones((10, 10), np.uint8)
  # open_img2 = cv2.morphologyEx(open_img, cv2.MORPH_OPEN, kernel2)
  # 由于部分图像得到的轮廓边缘不整齐,因此再进行一次膨胀操作
  element = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
  dilation_img = cv2.dilate(open_img, element, iterations=3)
  # 获取轮廓
  contours, hierarchy = cv2.findContours(dilation_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  # 测试边框识别结果
  # cv2.drawContours(img, contours, -1, (0, 0, 255), 3)
  # cv2.imshow("lpr", img)
  # cv2.waitKey(0)
  # 将轮廓规整为长方形
  rectangles = []
  for c in contours:
    x = []
    y = []
    for point in c:
      y.append(point[0][0])
      x.append(point[0][1])
    r = [min(y), min(x), max(y), max(x)]
    rectangles.append(r)
  # 用颜色识别出车牌区域
  # 需要注意的是这里设置颜色识别下限low时,可根据识别结果自行调整
  dist_r = []
  max_mean = 0
  for r in rectangles:
    block = img[r[1]:r[3], r[0]:r[2]]
    hsv = cv2.cvtColor(block, cv2.COLOR_BGR2HSV)
    low = np.array([100, 60, 60])
    up = np.array([140, 255, 255])
    result = cv2.inRange(hsv, low, up)
    # 用计算均值的方式找蓝色最多的区块
    mean = cv2.mean(result)
    if mean[0] > max_mean:
      max_mean = mean[0]
      dist_r = r
  # 画出识别结果,由于之前多做了一次膨胀操作,导致矩形框稍大了一些,因此这里对于框架+3-3可以使框架更贴合车牌
  cv2.rectangle(img, (dist_r[0]+3, dist_r[1]), (dist_r[2]-3, dist_r[3]), (0, 255, 0), 2)
  cv2.imshow("lpr", img)
  cv2.waitKey(0)
# 主程序
for i in range(5):
  lpr(str(i+1) + ".jpg")

参数调整

上述代码中,所有涉及到参数调整的函数,例如形态学操作,都需边调整边观察当前参数下的运行结果,待本步运行结果较好时,再继续写下一步。

该代码对具体图片要求较高,不同的图片可能无法成功识别车牌,此时可尝试依次调整预处理部分,形态学部分,hsv检测部分函数的参数

实验结果

python+opencv实现车牌定位功能(实例代码)

python+opencv实现车牌定位功能(实例代码)

python+opencv实现车牌定位功能(实例代码)

python+opencv实现车牌定位功能(实例代码)

python+opencv实现车牌定位功能(实例代码)

ps:图五是最难识别的图片,最后是通过调整hsv下限为[100, 60, 60]实现的

总结

以上所述是小编给大家介绍的python+opencv实现车牌定位功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
用pandas按列合并两个文件的实例
Apr 12 Python
实例讲解Python3中abs()函数
Feb 19 Python
python 画二维、三维点之间的线段实现方法
Jul 07 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
python 实现矩阵按对角线打印
Nov 29 Python
Python实现井字棋小游戏
Mar 09 Python
Python如何绘制日历图和热力图
Aug 07 Python
python中K-means算法基础知识点
Jan 25 Python
pandas map(),apply(),applymap()区别解析
Feb 24 Python
单身狗福利?Python爬取某婚恋网征婚数据
Jun 03 Python
Django+Celery实现定时任务的示例
Jun 23 Python
Python scrapy增量爬取实例及实现过程解析
Dec 24 #Python
Python 元组拆包示例(Tuple Unpacking)
Dec 24 #Python
Python 余弦相似度与皮尔逊相关系数 计算实例
Dec 23 #Python
Python编译成.so文件进行加密后调用的实现
Dec 23 #Python
Cython编译python为so 代码加密示例
Dec 23 #Python
Python编译为二进制so可执行文件实例
Dec 23 #Python
Python+opencv+pyaudio实现带声音屏幕录制
Dec 23 #Python
You might like
浅谈PHP表单提交(POST&GET&URL编/解码)
2017/04/03 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
img onload事件绑定各浏览器均可执行
2012/12/19 Javascript
js转义字符介绍
2013/11/05 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
解决node.js安装包失败的几种方法
2016/09/02 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
vue移动端的左右滑动事件详解
2020/06/17 Javascript
Python 自动补全(vim)
2014/11/30 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
浅谈python3.6的tkinter运行问题
2019/02/22 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
基于python 取余问题(%)详解
2020/06/03 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
StubHub西班牙:购买和出售全球活动门票
2017/06/05 全球购物
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
商务主管岗位职责
2013/12/08 职场文书
党在我心中演讲稿
2014/09/02 职场文书
2014基建处领导班子“四风”对照检查材料思想汇报
2014/10/04 职场文书
2014年教学工作总结
2014/11/13 职场文书
感恩教育观后感
2015/06/17 职场文书
小学班主任教育随笔
2015/08/15 职场文书
mysql使用 not int 子查询隐含陷阱
2022/04/12 MySQL
Redis数据同步之redis shake的实现方法
2022/04/21 Redis