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中Class类用法实例分析
Nov 12 Python
python中文件变化监控示例(watchdog)
Oct 16 Python
Python图像滤波处理操作示例【基于ImageFilter类】
Jan 03 Python
python学习开发mock接口
Apr 28 Python
python 表格打印代码实例解析
Oct 12 Python
在Django中实现添加user到group并查看
Nov 18 Python
python encrypt 实现AES加密的实例详解
Feb 20 Python
简单了解python调用其他脚本方法实例
Mar 26 Python
关于python 跨域处理方式详解
Mar 28 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
Apr 07 Python
基于Python实现粒子滤波效果
Dec 01 Python
python 详解turtle画爱心代码
Feb 15 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
正则表达式语法
2006/10/09 Javascript
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
PHP的Socket网络编程入门指引
2015/08/11 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
PHP attributes()函数讲解
2019/02/03 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
2019/04/09 PHP
js继承 Base类的源码解析
2008/12/30 Javascript
javascript工具库代码
2012/03/29 Javascript
JS打开新窗口的2种方式
2013/04/18 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
express的中间件basicAuth详解
2014/12/04 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
2016/03/07 Javascript
瀑布流的实现方式(原生js+jquery+css3)
2020/06/28 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
VUE 自定义组件模板的方法详解
2019/08/30 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
英国假发网站:Hothair
2018/02/23 全球购物
校园学雷锋活动月总结
2014/03/09 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
公司领导班子对照材料
2014/08/18 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android
vue特效之翻牌动画
2022/04/20 Vue.js