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 相关文章推荐
python实现bitmap数据结构详解
Feb 17 Python
Django与遗留的数据库整合的方法指南
Jul 24 Python
Flask框架URL管理操作示例【基于@app.route】
Jul 23 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
Nov 06 Python
python pcm音频添加头转成Wav格式文件的方法
Jan 09 Python
详解Python 定时框架 Apscheduler原理及安装过程
Jun 14 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
python实现桌面气泡提示功能
Jul 29 Python
python selenium登录豆瓣网过程解析
Aug 10 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
详解Django的MVT设计模式
Apr 29 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
咖啡的种类和口感
2021/03/03 新手入门
php全排列递归算法代码
2012/10/09 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
IE之动态添加DOM节点触发window.resize事件
2010/07/27 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
JS实现简单的抽奖转盘效果示例
2019/02/16 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
python encode和decode的妙用
2009/09/02 Python
python判断windows隐藏文件的方法
2014/03/21 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
python爬虫面试宝典(常见问题)
2018/03/02 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
python实现发送QQ邮件(可加附件)
2020/12/23 Python
请介绍一下WSDL的文档结构
2013/03/17 面试题
中国好声音广告词
2014/03/18 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
大型会议策划方案
2014/05/17 职场文书
物理课外活动总结
2014/08/27 职场文书
小学安全工作总结2015
2015/05/18 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
nginx之内存池的实现
2022/06/28 Servers