https://magpi.raspberrypi.org/articles/anpr-car-spy-raspberry-pi
自动车牌识别(ANPR)变得越来越普遍。曾经是警察的专有领域,现在可以在超市和机场停车场找到用于准确读取汽车车牌的技术。
不久之前,ANPR技术的购买和实施成本非常昂贵。现在,即使是Raspberry Pi也可以使用Pi Camera Module和开源软件来高精度读取车牌号。让我们通过构建一个系统来检测和提醒汽车何时驶入车道,来演示可能的方法。
本教程由PJ Evans撰写,首次出现在The MagPi 79中。单击此处订阅The MagPi杂志。
ANPR Raspberry Pi:选择一个位置
首先,我们要放在哪里?尽管该项目有很多应用程序,但我们将通过阅读在车道上来回行驶的汽车的车号牌来了解谁在家里。这意味着Raspberry Pi可能要住在室外。因此,许多环境制约因素都应运而生。尽管该软件令人惊讶地可以承受角度和高度,但您需要为Pi配备USB 5 V电源以及适合于读板的安装位置,因此,如果无法完美对齐,请不要担心太多。
获取附件
由于我们的树莓派将要居住在室外(除非您有一个放置良好的窗户),因此您需要一个合适的外壳。为了获得正确的构造,请获取IP67防水盒。
我们选择自制,并在带有RainBerry的Raspberry Pi 3 A +上使用– 3D可打印外壳,一旦添加一些橡胶密封垫,便可以提供足够的保护。确保选择的任何东西都在相机上有孔。
准备你的Pi
由于我们不需要图形用户界面,因此Raspbian Stretch Lite是我们选择的操作系统。任何Pi都可以处理此任务,尽管如果您想要最快的图像处理速度,则可能要避免使用“零”模型并获得一个漂亮的,快速的3B或3B +模型。设置操作系统,确保已完成必要的sudo apt更新&& sudo apt -y升级,并且如果不使用以太网,则已配置WiFi。最后,确保您的Pi摄像头模块已连接并启用。您可以通过运行sudo raspi-config并在“接口选项”下查看来进行检查。
安装openALPR
幸运的是,我们不需要成为机器学习和图像处理方面的专家即可实施ANPR。openALPR是一个开源项目,仅从摄像机图像即可提供快速而准确的处理。“ ALPR”不是错误:该美国项目是“自动车牌识别”。借助APT,安装非常简单。在命令行中,输入以下内容:
sudo apt install openalpr openalpr-daemon openalpr-utils libopenalpr-dev
这可能需要一段时间,因为需要安装许多支持软件包,例如Tesseract,一种开源光学字符识别(OCR)工具。这与标识车牌的代码结合在一起,才是神奇的方法。
考试时间
安装完成后,您将毫不客气地退回到命令提示符。OpenALPR安装了一个命令行工具,以使其功能测试更加容易,并且还提供了示例图像。在命令行上,输入以下内容:
cd
wget http://plates.openalpr.com/ea7the.jpg
这是美国板块图像的样本,也是一张困难的图像。Wget从Web上获取文件并将其放置在您的主目录中。让我们看看是否可以识别它:
alpr -c us ea7the.jpg
一切顺利,您会在屏幕上看到报告。最可能的“匹配项”应与文件名EA7THE相同。
安装Python库
我们也可以在Python中使用openALPR。首先,使用pip安装库。如果没有安装pip,请运行:
sudo apt install python-pip
要安装库:
pip install openalpr picamera python-pushover
现在,通过运行Python来测试一切是否正常,并在>>>提示符下逐行输入以下代码:
import json
from openalpr import Alpr
alpr = Alpr("us", "/etc/openalpr/openalpr.conf", "/usr/share/openalpr/runtimedata")
results = alpr.recognize
file("/home/pi/ea7the.jpg")
print(json.dumps(results, indent=4))
alpr.unload()
如果您以前没有看过JSON格式的文本,这看起来可能有点多,但是您应该看到返回的正确车牌号是第一个结果。
获取Pushover令牌
为了使我们能够在汽车驶入或驶出时获得警报,我们使用了最喜欢的旧Pushover,这使向手机发送通知变得轻而易举。有免费试用版,之后每台设备固定费用为4.99美元,没有订阅或限制。登录后,转到“您的应用程序”并记下您的用户密钥。然后点击“创建应用程序/ API令牌”。将其命名为“ ANPR”,将所有其他字段保留为空白,然后单击“创建应用程序”。现在记下API令牌;您将需要此代码和用户密钥。
打字时间
现在,您拥有创建ANPR应用程序所需的一切。输入此处显示的代码清单或从GitHub下载。将其另存为anpr.py在您的主目录中。编辑文件,并在出现提示时输入您的用户和应用令牌。保存文件,然后输入以下内容进行测试:
python anpr.py
该代码串联使用了Pi摄像头模块和openALPR。摄像机每五秒钟拍摄一张照片,然后将其传递给openALPR进行分析。如果找到车牌,我们会得到号码。如果发生了更改,警报将发送到Pushover,然后将其转发到任何已注册的移动设备。
列出您的清单
如果您想拥有更友好的名称而不只是车牌号,请尝试在import语句之后添加Python字典,如下所示:
lookup = {
"ABC123": "Steve McQueen",
"ZXY123": "Lewis Hamilton"
}
然后,如下更改警报文本中number_plate的所有实例:
lookup[number_plate]
现在,您将得到一个友好的名称。看看如果无法识别车牌,是否可以处理。
开机启动
任何“免提” Raspberry Pi安装的关键部分都是确保在电源故障的情况下再次启动所需的服务。有很多方法可以做到这一点。我们将使用较简单的方法之一。
sudo nano /etc/rc.local
找到最后一行,退出0,然后在上面的行中输入以下内容:
#Start ANPR Monitoring
/usr/bin/python /home/pi/anpr.py
按CTRL + X,然后按Y保存文件。最后,再次运行先前的pip命令,这次使用sudo为root用户安装库:
sudo pip install openalpr picamera python-pushover
重新启动后,代码将启动并在后台运行。
添加日志记录和宵禁
这种安装方式的一种用途是跟踪汽车出入的时间。这对于宵禁对其保险实行限制的年轻驾驶员尤其有用。查看是否可以扩展代码以检查一段时间后是否未看到车牌。例如,如果您的年轻家庭成员有这样的限制,如果他们的汽车不在开车前30分钟,则向他们的手机发送警报。您可以为他们节省保费增加额!另外,为什么不将所有来回记录到文件中呢?少量数据分析可能有助于减少汽车使用或燃料成本。
自己做
和以往一样,一切都结束了。现在,您可以跟踪和记录车牌,有许多不同的应用程序可供您探索。由于所有图像分析都是在本地完成的,因此无需互联网连接即可使系统正常工作。是否有人在工作中“借用”您的停车位?赶快行动吧!为什么不把Car Spy Pi带到路上呢?它可以记录您遇到的每辆车,如果发生意外,这可能会很有用。将Raspberry Pi Zero和ZeroView结合起来 ,一切就绪。
from openalpr import Alpr from picamera import PiCamera from time import sleep import pushover # Pushover settings PUSHOVER_USER_KEY = "" PUSHOVER_APP_TOKEN = " " # 'gb' means we want to recognise UK plates, many others are available alpr = Alpr("gb", "/etc/openalpr/openalpr.conf", "/usr/share/openalpr/runtime_data") camera = PiCamera() pushover.init(PUSHOVER_APP_TOKEN) last_seen = None try: # Let's loop forever: while True: # Take a photo print('Taking a photo') camera.capture('/home/pi/latest.jpg') # Ask OpenALPR what it thinks analysis = alpr.recognize_file( "/home/pi/latest.jpg") # If no results, no car! if len(analysis['results']) == 0: print('No number plate detected') # Has a car left? if last_seen is not None: pushover.Client( PUSHOVER_USER_KEY).send_message( last_seen + " left", title="Driveway") last_seen = None else: number_plate = analysis['results'][0]['plate'] print('Number plate detected: ' + number_plate) # Has there been a change? if last_seen is None: pushover.Client( PUSHOVER_USER_KEY).send_message( number_plate + " has arrived", title="Driveway") elif number_plate != last_seen: pushover.Client( PUSHOVER_USER_KEY).send_message( number_plate + " arrived and " + last_seen + " left", title="Driveway") last_seen = number_plate # Wait for five seconds sleep(5) except KeyboardInterrupt: print('Shutting down') alpr.unload()