树莓派应用--AI项目实战篇来啦-10.OpenCV进行车牌检测

1. 介绍

本项目使用 esseract、OpenCV和Python探索光学字符识别(OCR)的神奇世界,本项目将

带你了解最受欢迎的OCR引擎 Tesseract 背后的技术,以及如何用 Pytesseract 和 OpenCV实现字符识别。

从图像中检测字符的技术称为 OCR(光学字符识别),使用 Pytesseract 库很容易实现。

2.Python pytesseract 字符识别OCR库介绍

Python 提供了支持 Tesseract-OCR 引擎的 Python 版本的库 pytesseract, pytesseract是一款用于光学字符识别(OCR)的python工具,即从图片中识别出和"读取"其中嵌入的文字。

pytesseract 是对 Tesseract-OCR的一层封装,同时也可以单独作为对 Tesseract 引擎的调用脚本,支持使用 PIL库(Python Imaging Library)读取各种图片文件类型,包括jpeg、png、gif、bmp、tiff 等其它格式。作为脚本使用时,pytesseract 将打印识别出的文字,而不是将其写入文件。

2.1 Pytesseract 字符识别库安装

复制代码
sudo apt-get update 
sudo apt-get install libleptonica-dev 
sudo apt-get install tesseract-ocr 
sudo apt-get install libtesseract-dev 
pip3 install pytesseract 
pip3 install pillow

2.2 车牌识别相关操作

1.车牌检测:第一步是从汽车上检测车牌所在位置。使用OpenCV中矩形的轮廓检测来寻找车牌,如果我们知道车牌的确切尺寸,颜色和大致位置,则可以提高准确性。通常,也会将根据摄像机的位置和该特定国家/地区所使用的车牌类型来训练检测算法。但是图像可能并没有汽车的存在,在这种情况下我们将先进行汽车的,然后是车牌。

2.字符分割:检测到车牌后,必须将其裁剪并保存为新图像。同样,这可以使用OpenCV 来完成。

  1. 字符识别,在上一步中获得的新图像肯定可以写上一些字符(数字/字母)。因此,我们可以对其执行 OCR(光学字符识别)以检测数字。

3.源程序代码

python 复制代码
import cv2
import imutils
import numpy as np
import pytesseract

img  = cv2.imread('./images/car2.jpg',cv2.IMREAD_COLOR)

img = cv2.resize(img, (600,400) )

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
gray = cv2.bilateralFilter(gray, 13, 15, 15)

edged = cv2.Canny(gray, 30, 200) 
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

# 载入显示库
def bgr8_to_jpeg(value, quality=75):
    return bytes(cv2.imencode('.jpg', value)[1])
    
import ipywidgets.widgets as widgets
from IPython.display import display
imagecar = widgets.Image(format='jpeg', width=600, height=400)
imageCropped = widgets.Image(format='jpeg', width=600, height=400)
display(imagecar)
display(imageCropped)

for c in contours:
    
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.018 * peri, True)
 
    if len(approx) == 4:
        screenCnt = approx
        break

if screenCnt is None:
    detected = 0
    print ("No contour detected")
else:
     detected = 1

if detected == 1:
    cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)

mask = np.zeros(gray.shape,np.uint8)
new_image = 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+1, topy:bottomy+1]

text = pytesseract.image_to_string(Cropped, config='--psm 11')
print("programming_fever's License Plate Recognition\n")
print("Detected license plate Number is:",text)
img = cv2.resize(img,(500,300))
Cropped = cv2.resize(Cropped,(400,200))
# 显示图像
imagecar.value = bgr8_to_jpeg(img)
imageCropped.value = bgr8_to_jpeg(Cropped)

相关推荐
编程小白_正在努力中6 小时前
神经网络深度解析:从神经元到深度学习的进化之路
人工智能·深度学习·神经网络·机器学习
无风听海7 小时前
神经网络之经验风险最小化
人工智能·深度学习·神经网络
音视频牛哥7 小时前
轻量级RTSP服务的工程化设计与应用:从移动端到边缘设备的实时媒体架构
人工智能·计算机视觉·音视频·音视频开发·rtsp播放器·安卓rtsp服务器·安卓实现ipc功能
该用户已不存在7 小时前
在 Gemini CLI 中使用 Gemini 3 Pro 实操指南
人工智能·ai编程·gemini
东皇太星7 小时前
ResNet (2015)(卷积神经网络)
人工智能·神经网络·cnn
aircrushin8 小时前
TRAE SOLO 中国版,正式发布!AI 编程的 "Solo" 时代来了?
前端·人工智能
Java中文社群8 小时前
保姆级教程:3分钟带你轻松搭建N8N自动化平台!(内附视频)
人工智能·工作流引擎
是Yu欸8 小时前
DevUI MateChat 技术演进:UI 与逻辑解耦的声明式 AI 交互架构
前端·人工智能·ui·ai·前端框架·devui·metachat
我不是QI8 小时前
周志华《机器学习---西瓜书》 一
人工智能·python·机器学习·ai
H***99768 小时前
月之暗面公开强化学习训练加速方法:训练速度暴涨97%,长尾延迟狂降93%
人工智能·深度学习·机器学习