车牌检测(分别使用Haar级联 和轮廓裁剪)
使用两种方法对比识别车牌
1.轮廓查找
首先对读取图片,做基本处理
将原图片转为灰度图片
再进行双边滤波
img = cv2.imread("img") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 双边滤波 gray1 = cv2.bilateralFilter(gray, 13, 15, 15)plt.imshow(gray,cmap="gray") plt.imshow(gray1,cmap="gray") plt.show()
如图
寻找轮廓
imutils是一个 OpenCV 的 Python 封装库,简化了图像的处理,可以更方便的实现图像显示(使用 Matplotlib)、平移(Translate)、旋转(Rotate)、缩放(Resize)、骨架化(Skeletonizate)等操作。
contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours = imutils.grab_contours(contours)# 根据区域大小排序取前十个contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]screenCnt = None# 遍历轮廓,找到车牌轮廓for c in contours:# 计算轮廓周长(轮廓,是否闭合)peri = cv2.arcLength(c, True)# 折线化(轮廓,阈值(越小越接近曲线),是否闭合)返回折线顶点坐标approx = cv2.approxPolyDP(c, 0.018 * peri, True)# 获取四个顶点(即四边形)if len(approx) == 4:screenCnt = approxbreak# 如果找到了四边形if screenCnt is not None:# 根据四个顶点坐标对img画线(图像矩阵,轮廓坐标集,轮廓索引,颜色,线条粗细)cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)
标记车牌区域:
# 创建一个灰度图一样大小的图像矩阵mask = np.zeros(gray.shape, np.uint8)# 将创建的图像矩阵的车牌区域画成白色cv2.drawContours(mask, [screenCnt], 0, 255, -1, )# 图像位运算进行遮罩new_image = cv2.bitwise_and(img, img, mask=mask)
对车牌进行处理:
将车牌区域裁剪
# 获取车牌区域的所有坐标点(x, y) = np.where(mask == 255)# 获取底部顶点坐标(topx, topy) = (np.min(x), np.min(y))# 获取底部坐标(bottomx, bottomy,) = (np.max(x), np.max(y))# 剪裁Cropped = gray[topx:bottomx, topy:bottomy]
最后使用pytesseract库进行车牌内容识别
text = ts.image_to_string(Cropped, config='--psm 11')print("车牌结果:", text)
运行结果:
附上完整代码
import cv2 import matplotlib.pyplot as plt import imutils import pytesseract as ts import numpy as np if __name__ == '__main__':img = cv2.imread("img")img = cv2.resize(img, (620, 480))gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 双边滤波gray1 = cv2.bilateralFilter(gray, 13, 15, 15)# 显示效果plt.subplot(1,2,1)plt.imshow(gray,cmap="gray")plt.subplot(1,2,2)plt.imshow(gray1,cmap="gray")plt.show()edged = cv2.Canny(gray, 50, 200)plt.imshow(edged,cmap="gray")plt.show()contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours = imutils.grab_contours(contours)# 根据区域大小排序取前十个contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]screenCnt = None# 遍历轮廓,找到车牌轮廓for c in contours:# 计算轮廓周长(轮廓,是否闭合)peri = cv2.arcLength(c, True)# 折线化(轮廓,阈值(越小越接近曲线),是否闭合)返回折线顶点坐标approx = cv2.approxPolyDP(c, 0.018 * peri, True)# 获取四个顶点(即四边形)if len(approx) == 4:screenCnt = approxbreak# 如果找到了四边形if screenCnt is not None:# 根据四个顶点坐标对img画线(图像矩阵,轮廓坐标集,轮廓索引,颜色,线条粗细)cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)"""遮罩"""# 创建一个灰度图一样大小的图像矩阵mask = np.zeros(gray.shape, np.uint8)# 将创建的图像矩阵的车牌区域画成白色cv2.drawContours(mask, [screenCnt], 0, 255, -1, )# 图像位运算进行遮罩new_image = cv2.bitwise_and(img, img, mask=mask)"""图像剪裁"""# 获取车牌区域的所有坐标点(x, y) = np.where(mask == 255)# 获取底部顶点坐标(topx, topy) = (np.min(x), np.min(y))# 获取底部坐标(bottomx, bottomy,) = (np.max(x), np.max(y))# 剪裁Cropped = gray[topx:bottomx, topy:bottomy]#显示效果cv2.imshow('img', img)cv2.imshow('gray', gray)cv2.imshow('edged', edged)cv2.imshow('new_image ',new_image )cv2.imshow('Cropped',Cropped)cv2.waitKey(0)cv2.destroyAllWindows()plt.imshow(Cropped,cmap='gray')plt.show()text = ts.image_to_string(Cropped, config='--psm 11')print("车牌结果:", text)
在这里可能会出现pytesseract库调用识别导致无法识别车牌内容,详情请参考pytesseract的下载和调用。
2.使用Haar级联模型车牌检测
依旧是先读取图片
carplate_img = cv2.imread('img')
carplate_img_rgb = cv2.cvtColor(carplate_img, cv2.COLOR_BGR2RGB)plt.subplot(1, 2, 1)
plt.imshow(carplate_img)
plt.subplot(1,2,2)
plt.imshow(carplate_img_rgb);
plt.show()
写一个可以调整图片大小的函数,并且进行保存
def enlarge_plt_display(image, scale_factor):width = int(image.shape[1] * scale_factor / 100)height = int(image.shape[0] * scale_factor / 100)dim = (width, height)plt.figure(figsize = dim)plt.axis('off') plt.imshow(image)
使用方法enlarge_plt_display(carplate_img, 1)
其中数字参数表示对该图片的大小处理的倍数
接下来我们调用Haar级联的车牌检测模型
Haar级联检测5个特征:边缘特征、线特征、四角-矩形的特征,计算特征需要从黑色区域下的像素总和中减去白色区域下的像素总和。
这里我们所用的是Haar级联已经训练好的模型,本质上属于四角-矩形的特征检测
这里是一些常用的模型简介 可以点击此处从官方github中下载
- haarcascade_frontalface_default.xml:检测面部
- haarcascade_eye.xml:检测左眼和右眼
- haarcascade_smile.xml:检测面部是否存在嘴部
- haarcascade_eye_tree_eyeglasses.xml:检测是否带墨镜
车牌检测(分别使用Haar级联 和轮廓裁剪)相关推荐
- 使用Python,OpenCV和Haar级联进行人脸检测——轻量级的人脸检测器
使用Python,OpenCV和Haar级联进行人脸检测--轻量级的人脸检测器 1. 效果图 2. 原理 2.1 项目结构 2.2 [haarcascade_frontalface_default.x ...
- OpenCV 4.x 中请别再用HAAR级联检测器检测人脸!有更好更准的方法
点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自OpenCV学堂. 引言 我写这篇文章是因为我很久以前写过一些文章,用了人脸检测,我当时用的都是HAAR级联检测器,导致最近几个人问我说这个H ...
- 【youcans 的图像处理学习课】22. Haar 级联分类器
专栏地址:『youcans 的图像处理学习课』 文章目录:『youcans 的图像处理学习课 - 总目录』 [youcans 的图像处理学习课]22. Haar 级联分类器 3. Haar 特征及其加 ...
- 使用 OpenCV与 HAAR 级联算法进行人脸检测和人脸识别
AI人脸识别是一种从数字图像或视频帧中识别或验证人脸的技术.人类可以毫不费力地快速识别面部.这对我们来说是一项轻松的任务,但对计算机来说却是一项艰巨的任务.因为存在各种复杂性,例如低分辨率.遮挡.光照 ...
- Pyhton,OpenCV对象检测之——Haar级联人脸及眼睛检测
Pyhton,OpenCV对象检测之--Haar级联人脸及眼睛检测 1. 效果图 2. 原理 2.1 Haar人脸检测原理 2.2 Haar级联预训练的模型 3. 源码 3.1 图像面部及眼睛检测 3 ...
- Python人工智能实例 │ 使用Haar级联进行人脸检测、使用CAMShift算法、光流法进行人脸追踪
使用Haar级联进行人脸检测 使用CAMShift算法进行人脸追踪 使用光流法进行人脸追踪 01.背景知识 1.1●Haar级联简介 Haar级联是基于Haar特征的级联分类器.那么级联分类器是什么? ...
- 使用OpenCV,Haar级联检测器进行面部、眼睛、嘴部检测
使用OpenCV,Haar级联检测器进行面部.眼睛.嘴部检测 1. 效果图 2. 原理 2.1 Haar级联是什么? 2.2 Haar级联的问题与局限性 2.3 Haar级联预训练的模型 3. 源码 ...
- 使用 Haar 级联人脸检测
Haar 级联概念 在进行图像分类和跟踪过程中,提取图像的细节很有用,这些细节也被称为特征,对于给定的图像,特征可能会因区域的大小而有所不同,区域大小也可被称为窗口大小.即使窗口大小不同,仅在尺度上大 ...
- OpenCV——Haar级联人眼检测数据
Haar级联 由于灯光.视角.视距.摄像头抖动以及数字噪声的变化,一个图像的细节可能会变得不稳定.但是人们在分类时却不会受这些物理细节方面差异的影响.因此,提取出图像的细节对产生稳定分类结果和跟踪结果 ...
最新文章
- Keil5 STM32F系列 安装 安装包
- Android Studio导入别人的module提示错误Plugin with id ‘com.jfrog.bintray‘ not found.
- C 为什么非要引入那几种类型转换?
- 【原创】Android之修改AlertDialog对话框及使用系统Holo风格
- Java:双向链表反转实现
- redis数据结构小结
- 二、CGS2000坐标系
- 斗鱼VS虎牙,谁才是直播之王?一文带你看看两家平台 的竞品报告
- 网卡82546驱动linux,Dell服务器常见Linux驱动选择
- 金字塔简单代码(java)
- pdf如何在线旋转?PDF旋转的方法
- 依赖函数检查 mysql_connect()_解决的方法:mysql_connect()不支持请检查mysql模块是否正确载入...
- initialize
- 中美IT人才俱乐部第一次活动见闻
- 【保持阅读习惯才能无障碍阅读】如何阅读英文时报 magazinelib 获取报纸
- 二、 FATE实战:实现横向逻辑回归任务的训练及预测
- 计算机保研面试自我介绍,计算机保研面试英文自我介绍范文
- 碰撞、子弹路径、参考
- java数字签名(签名生成,用证书验证签名)
- Android12之OpenSL ES基础数据结构总结(十)
热门文章