一步一步详细讲解:python+opencv的车牌提取大全
nanshan 2024-10-08 05:30 25 浏览 0 评论
1 说明:
=====
1.1 环境:
python3.8,深度操作系统deepin-linux,微软编辑器vscode,opencv版本4.2.0。
1.2 上一篇:
《强!全套完整中文车牌识别,纯python来实现和代码分析》
1.3 本次讲解:超级详细,一步一步,注释分析,小白都会。
1.4 注意:代码为注释讲解版,有点繁琐,但是可读性较高,大神可以封装成函数,去掉注释和窗口显示过程。
2 图片:来自今日头条免费正版图库:
===代码逐步分析===
3 读取图片并显示原始图片:额外知识
=============================
3.1 cv2法:显示是原图,省略。牵涉到知识点是图片的通道的拆分和合并。
import cv2
origin_image = cv2.imread('/home/xgj/Desktop/car911/2.jpeg')
cv2.imshow('image', origin_image)
cv2.waitKey(0)
3.2 matplotlib法:
import cv2
#---第2步:读取待检测原始的图片---
origin_image = cv2.imread('/home/xgj/Desktop/car911/2.jpeg')
#---第3步:显示图片法---
'''
# cv2显示图片法:原图
cv2.imshow('image', origin_image)
cv2.waitKey(0)
'''
'''
# matplotlib法直接显示,不是原图
from matplotlib import pyplot as plt
plt.imshow(origin_image)
plt.show()
'''
# 调整通道的顺序,显示原图
# 分割通道
from matplotlib import pyplot as plt
#说明cv2读取的顺序是bgr
#而matplotlib显示rgb,故显示plt原图法需要转换
b,g,r = cv2.split(origin_image)
# 合并通道
img = cv2.merge([r, g, b])
plt.imshow(img)
plt.show()
3.3 图:
4 提取蓝色车牌:
============
4.1 代码:
#---第1步:导入所需模块---
import cv2
from matplotlib import pyplot as plt
#---第2步:读取待检测原始的图片---
origin_image = cv2.imread('/home/xgj/Desktop/car911/2.jpeg')
# 可注释掉
# 调整通道的顺序
# 分割通道
b,g,r = cv2.split(origin_image)
# 合并通道
img = cv2.merge([r, g, b])
#用matplotlib的plt显示图片
plt.imshow(img)
plt.show()
#---第3步:提取车牌部分图片---
#图像去噪灰度处理
# 3-1:对原始图片origin_image进行高斯模糊
Gausiian_image = cv2.GaussianBlur(origin_image, (3, 3), 0)
#可注释掉
plt.imshow(Gausiian_image)
plt.show()
# 3-2:灰度化处理图像
gray_image = cv2.cvtColor(Gausiian_image, cv2.COLOR_RGB2GRAY)
#可注释掉
plt.imshow(gray_image)
plt.show()
# 3-3:Sobel算子
Sobel_x = cv2.Sobel(gray_image, cv2.CV_16S, 1, 0) # 对x求一阶导,垂直检测
#Sobel_y = cv2.Sobel(gray_image, cv2.CV_16S, 0, 1) # 附注:对y求一阶导,水平检测
absX = cv2.convertScaleAbs(Sobel_x) # 转回uint8
#定义车牌
imagechepai = absX
# 3-4:图像二值化
ret, image2 = cv2.threshold(imagechepai, 0, 255, cv2.THRESH_OTSU)
# 3-5:闭操作可以将目标区域连成一个整体,便于后续轮廓的提取。
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (17, 5))
image3 = cv2.morphologyEx(image2, cv2.MORPH_CLOSE, kernelX,iterations = 3)
#可注释掉
plt.imshow(image3)
plt.show()
# 3-6:膨胀和腐蚀
#通过膨胀连接相近的图像区域,通过腐蚀去除孤立细小的色块。
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 1))
kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 19))
#膨胀第1次
image4 = cv2.dilate(image3, kernelX)
plt.imshow(image4)
plt.show()
#腐蚀第1次
image5 = cv2.erode(image4, kernelX)
plt.imshow(image5)
plt.show()
#腐蚀第2次
image6 = cv2.erode(image5, kernelY)
plt.imshow(image6)
plt.show()
#膨胀第2次
image7 = cv2.dilate(image6, kernelY)
plt.imshow(image7)
plt.show()
# 3-7:中值滤波:去除图像或者其它信号中的噪声。
image8 = cv2.medianBlur(image7, 15)
plt.imshow(image8)
plt.show()
# 3-8:查找轮廓
contours, hierarchy = cv2.findContours(image8, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 3-9:判断车牌区域:
for item in contours:
rect = cv2.boundingRect(item)
x = rect[0]
y = rect[1]
weight = rect[2]
height = rect[3]
if (weight > (height * 3)) and (weight < (height * 4)):
image9 = origin_image[y:y + height, x:x + weight] #侧位车牌和黄色车牌报错
#提取车牌,生成车牌图片
cv2.imwrite('/home/xgj/Desktop/car911/chepai1.png', image9)
cv2.imshow('image', image9)
cv2.waitKey(0)
4.2 操作和效果图:
4.3 正位绿色车牌:OK,省略。(新能源汽车车牌,正面非侧位OK)
5 bug分析:
============
5.1 图:
6 黄色车牌定位和提取(图:3.jpeg):
=============================
6.1 代码:换一种思维
#---第1步:导入模块--
import cv2
import numpy as np
#---第2步:读取原图---
img = cv2.imread('/home/xgj/Desktop/car911/3.jpeg')
#可注释掉
cv2.imshow("pic1",img) #显示原图
cv2.waitKey(0)
#---第3步:预处理---
# 包括灰度处理,高斯滤波平滑处理,Sobel提取边界,图像二值化
# 3-1:灰度处理
gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.imshow("pic2", gray_img)
cv2.waitKey(0)
# 3-2:高斯滤波平滑处理
GaussianBlur_img = cv2.GaussianBlur(gray_img, (3, 3), 0)
cv2.imshow("pic3", GaussianBlur_img)
cv2.waitKey(0)
# 3-3:Sobel提取边界
Sobel_img = cv2.Sobel(GaussianBlur_img, -1, 1, 0, ksize=3)
cv2.imshow("pic4", Sobel_img)
cv2.waitKey(0)
# 3-4:图像二值化
ret, binary_img = cv2.threshold(Sobel_img, 127, 255, cv2.THRESH_BINARY)
#---第4步:形态学运算---
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)
#结构元素可以是矩形/椭圆/十字形,可以用cv2.getStructuringElement()来生成不同形状的结构元素
element = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) #矩形结构
dilation_img = cv2.dilate(open_img, element, iterations=3)
cv2.imshow("pic4", dilation_img)
cv2.waitKey(0)
#---第5步:获取轮廓---
# 5-1:2个指标,易报错,与opencv版本有关
contours, hierarchy = cv2.findContours(dilation_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 测试边框识别结果,注释掉,否则汽车车牌提取后有绿色轮廓,不好看
#cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
#cv2.imshow("pic5", img) #绘制轮廓图
#cv2.waitKey(0)
# 5-2:从轮廓中提取坐标
# 将轮廓规整为长方形
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)
# 5-3:用颜色识别出车牌区域
dist_r = []
max_mean = 0
for r in rectangles:
carmask = img[r[1]:r[3], r[0]:r[2]] #车牌区域面积大小
hsv = cv2.cvtColor(carmask, cv2.COLOR_BGR2HSV)
'''
#蓝色车牌,可以使用
low = np.array([100, 60, 60])
up = np.array([140, 255, 255])
'''
#黄色车牌
low = np.array([15, 55, 55])
up = np.array([50, 255, 255])
'''
#绿色车牌:系能源汽车报错,因为车牌底色不是全绿,白色渐变绿色
low = np.array([50, 50, 50])
up = np.array([100, 255, 255])
'''
result = cv2.inRange(hsv, low, up)
# 用计算均值的方式找蓝色最多的区块
mean = cv2.mean(result)
if mean[0] > max_mean:
max_mean = mean[0]
dist_r = r
# 画出识别结果,定位用,截取车牌时就不要了,否则车牌上有绿色框,不好看
#cv2.rectangle(img, (dist_r[0]+3, dist_r[1]), (dist_r[2]-3, dist_r[3]), (0, 255, 0), 2)
#参数格式:cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2)
#一般格式
#qichechepai = img[y:y + height, x:x + weight]
qichechepai = img[dist_r[1]:dist_r[3], dist_r[0]+3:dist_r[2]-3]
#提取车牌,生成车牌图片
cv2.imwrite('/home/xgj/Desktop/car911/chepai3.png', qichechepai)
cv2.imshow('qichechepaitiqu', qichechepai)
cv2.waitKey(0)
6.2 操作和效果图:
6.3 新能源汽车车牌就不适合。
7 侧面车牌定位和提取:
=================
7.1 分类器:下载地址
https://github.com/zeusees/HyperLPR/blob/master/model/cascade.xml #分类器来自别人,感谢
7.2 代码:
#---第1步:导出模块--
import cv2
import numpy as np
#---第2步:定义侦测函数
def detect(image):
# 调用分类器,提前下载好
cascade_path = '/home/xgj/Desktop/car911/cascade.xml'
cascade = cv2.CascadeClassifier(cascade_path)
# 修改图片大小
resize_h = 400
height = image.shape[0]
scale = image.shape[1] / float(height)
image = cv2.resize(image, (int(scale * resize_h), resize_h))
# 转为灰度图
image_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
#查找车牌
car_plates = cascade.detectMultiScale(image_gray, 1.1, 2, minSize=(36, 9), maxSize=(36 * 40, 9 * 40))
# print("检测到车牌数", len(car_plates))
#判断
if len(car_plates) > 0:
for car_plate in car_plates:
x, y, w, h = car_plate
#画汽车车牌矩形并截取
qichechepai = image[y-10: y + h + 10, x-10: x + w + 10]
cv2.imshow('plate', qichechepai) #显示车牌窗口
cv2.imwrite('/home/xgj/Desktop/car911/ccnew.png', qichechepai) #保存提取汽车车牌
#画车牌识别定位框
cv2.rectangle(image, (x - 10, y - 10), (x + w + 10, y + h + 10), (0, 255, 0), 2)
cv2.imshow("image", image) #显示原图上定位并画出识别框
if __name__ == '__main__':
#导入原图
image = cv2.imread('/home/xgj/Desktop/1-chepai-dingwei/fenleiqi/cc.jpeg')
detect(image)
cv2.waitKey(0)
cv2.destroyAllWindows()
7.3 操作和效果图:
7.4 侧面新能源汽车车牌,可以搞定,小bug:
===汽车车牌定位和提取大全===
高手可以整合、定义函数、封装
不管了,好东西就应该分享。
相关推荐
- 服务器数据恢复—Raid5数据灾难不用愁,Raid5数据恢复原理了解下
-
Raid5数据恢复算法原理:分布式奇偶校验的独立磁盘结构(被称之为raid5)的数据恢复有一个“奇偶校验”的概念。可以简单的理解为二进制运算中的“异或运算”,通常使用的标识是xor。运算规则:若二者值...
- 服务器数据恢复—多次异常断电导致服务器raid不可用的数据恢复
-
服务器数据恢复环境&故障:由于机房多次断电导致一台服务器中raid阵列信息丢失。该阵列中存放的是文档,上层安装的是Windowsserver操作系统,没有配置ups。因为服务器异常断电重启后,rai...
- 服务器数据恢复-V7000存储更换磁盘数据同步失败的数据恢复案例
-
服务器数据恢复环境:P740+AIX+Sybase+V7000存储,存储阵列柜上共12块SAS机械硬盘(其中一块为热备盘)。服务器故障:存储阵列柜中有磁盘出现故障,工作人员发现后更换磁盘,新更换的磁盘...
- 「服务器数据恢复」重装系统导致XFS文件系统分区丢失的数据恢复
-
服务器数据恢复环境:DellPowerVault系列磁盘柜;用RAID卡创建的一组RAID5;分配一个LUN。服务器故障:在Linux系统层面对LUN进行分区,划分sdc1和sdc2两个分区。将sd...
- 服务器数据恢复-ESXi虚拟机被误删的数据恢复案例
-
服务器数据恢复环境:一台服务器安装的ESXi虚拟化系统,该虚拟化系统连接了多个LUN,其中一个LUN上运行了数台虚拟机,虚拟机安装WindowsServer操作系统。服务器故障&分析:管理员因误操作...
- 「服务器数据恢复」Raid5阵列两块硬盘亮黄灯掉线的数据恢复案例
-
服务器数据恢复环境:HPStorageWorks某型号存储;虚拟化平台为vmwareexsi;10块磁盘组成raid5(有1块热备盘)。服务器故障:raid5阵列中两块硬盘指示灯变黄掉线,无法读取...
- 服务器数据恢复—基于oracle数据库的SAP数据恢复案例
-
服务器存储数据恢复环境:某品牌服务器存储中有一组由6块SAS硬盘组建的RAID5阵列,其中有1块硬盘作为热备盘使用。上层划分若干lun,存放Oracle数据库数据。服务器存储故障&分析:该RAID5阵...
- 「服务器虚拟化数据恢复」Xen Server环境下数据库数据恢复案例
-
服务器虚拟化数据恢复环境:Dell某型号服务器;数块STAT硬盘通过raid卡组建的RAID10;XenServer服务器虚拟化系统;故障虚拟机操作系统:WindowsServer,部署Web服务...
- 服务器数据恢复—RAID故障导致oracle无法启动的数据恢复案例
-
服务器数据恢复环境:某品牌服务器中有一组由4块SAS磁盘做的RAID5磁盘阵列。该服务器操作系统为windowsserver,运行了一个单节点Oracle,数据存储为文件系统,无归档。该oracle...
- 服务器数据恢复—服务器磁盘阵列常见故障表现&解决方案
-
RAID(磁盘阵列)是一种将多块物理硬盘整合成一个虚拟存储的技术,raid模块相当于一个存储管理的中间层,上层接收并执行操作系统及文件系统的数据读写指令,下层管理数据在各个物理硬盘上的存储及读写。相对...
- 「服务器数据恢复」IBM某型号服务器RAID5磁盘阵列数据恢复案例
-
服务器数据恢复环境:IBM某型号服务器;5块SAS硬盘组成RAID5磁盘阵列;存储划分为1个LUN和3个分区:第一个分区存放windowsserver系统,第二个分区存放SQLServer数据库,...
- 服务器数据恢复—Zfs文件系统下误删除文件如何恢复数据?
-
服务器故障:一台zfs文件系统服务器,管理员误操作删除服务器上的数据。服务器数据恢复过程:1、将故障服务器所有磁盘编号后取出,硬件工程师检测所有硬盘后没有发现有磁盘存在硬件故障。以只读方式将全部磁盘做...
- 服务器数据恢复—Linux+raid5服务器数据恢复案例
-
服务器数据恢复环境:某品牌linux操作系统服务器,服务器中有4块SAS接口硬盘组建一组raid5阵列。服务器中存放的数据有数据库、办公文档、代码文件等。服务器故障&检测:服务器在运行过程中突然瘫痪,...
- 服务器数据恢复—Sql Server数据库数据恢复案例
-
服务器数据恢复环境:一台安装windowsserver操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。在windows服务器内装有SqlServer数据库。存储空间LU...
- 服务器数据恢复—阿里云ECS网站服务器数据恢复案例
-
云服务器数据恢复环境:阿里云ECS网站服务器,linux操作系统+mysql数据库。云服务器故障:在执行数据库版本更新测试时,在生产库误执行了本来应该在测试库执行的sql脚本,导致生产库部分表被tru...
你 发表评论:
欢迎- 一周热门
-
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
WindowsServer2022|配置NTP服务器的命令
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统
-
解决Linux终端中“-bash: nano: command not found”问题
-
NBA 2K25虚拟内存不足/爆内存/内存占用100% 一文速解
-
Linux 中的文件描述符是什么?(linux 打开文件表 文件描述符)
-
K3s禁用Service Load Balancer,解决获取浏览器IP不正确问题
-
- 最近发表
-
- 服务器数据恢复—Raid5数据灾难不用愁,Raid5数据恢复原理了解下
- 服务器数据恢复—多次异常断电导致服务器raid不可用的数据恢复
- 服务器数据恢复-V7000存储更换磁盘数据同步失败的数据恢复案例
- 「服务器数据恢复」重装系统导致XFS文件系统分区丢失的数据恢复
- 服务器数据恢复-ESXi虚拟机被误删的数据恢复案例
- 「服务器数据恢复」Raid5阵列两块硬盘亮黄灯掉线的数据恢复案例
- 服务器数据恢复—基于oracle数据库的SAP数据恢复案例
- 「服务器虚拟化数据恢复」Xen Server环境下数据库数据恢复案例
- 服务器数据恢复—RAID故障导致oracle无法启动的数据恢复案例
- 服务器数据恢复—服务器磁盘阵列常见故障表现&解决方案
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)