Identify Cars Using Raspberry Pi
Description
The principle of operation:
- The car drives up to the gates.
- Camera reads the car plate numbers.
- Checks the read number with the database; if it finds one, then it opens the gate and lets the car pass.
- Each car at the gates is photographed, then a photo is sent to the Telegram application with the car plate number and its status.
- Telegram bot has the ability to open and close the gates, take a current photo and add an unknown car to the database.
It’s done with OpenCV + Python + Bash + Telegram Bot.
*** I’m working now on web-interface which will have the ability to:
1. Open/pause/close the gates
2. Add/Remove/Edit/Block cars
3. Add/Remove/Edit/Block ip cameras
4. Set Gpio number for the relay
5. Set ip camera’s zoom
6. Enable/disable auto open for gates
7. Add/Remove/Edit/Block users, set status and privileges
8. Log for car recognition where you can preview, search cars by date/number and export log in excel format
Preparation
For this you will need an RPI3 with the Ubuntu Mate installed. You can get it here: https://ubuntu-mate.org/download/
Installing ALPR library
The easiest way to install
sudo apt-get update && sudo apt-get install -y openalpr openalpr-daemon openalpr-utils libopenalpr-dev
Install ImageMagick
sudo apt-get install imagemagick
Installing dependencies for Telegram bot
sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev libjansson-dev libpython-dev make
apt-get update
apt-get -y install python-pip
pip install pytelegrambotapi
pip install json
Installing Telegram-cli
Check this link to install and configure telegram-cli in ubuntu.
Relay connection
- Connect relay to RPI 3. In my case I used GPIO23 pin for 1st relay and GPIO26 for the second one.
You can test the relay with shell script, just create a simple sh script and run it:
nano open.sh
chmod +x open.sh
sh open.sh
Paste the code below and run it.
Script code for relay 1:
#!/bin/bash
echo 23 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio23/direction
echo 0 > /sys/class/gpio/gpio23/value
ping -c 2 localhost
echo 23 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio23/direction
echo 1 > /sys/class/gpio/gpio23/value
Script code for relay 2:
#!/bin/bash
echo 26 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio26/direction
echo 0 > /sys/class/gpio/gpio26/value
ping -c 2 localhost
echo 26 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio26/direction
echo 1 > /sys/class/gpio/gpio26/value
Connect relays to gates
elegram message-send script
- Create .sh script with the following code:
#!/bin/bash
to=$1
msg=$2
tgpath=/home/user/tg
cd ${tgpath}
(sleep1; echo "dialog_list";sleep 1; echo "msg $to $msg";) | ${tgpath}/bin/telegram-cli -k -W tg-server.pub
Telegram photo-send script
- Create .sh script with the following code:
#!/bin/bash
to=$1
msg=$2
tgpath=/home/user/tg
cd ${tgpath}
(sleep 1; echo "dialog_list";sleep 1; echo "send_photo $to $msg";) | ${tgpath}/bin/telegram-cli -k -W tg-server.pub
Create 2 files for the main recognition script:
touch log.txt
touch numbers.txt
In the numbers.txt – add all the known car plates numbers.
Order of the numbers.txt should be as follows:
YZO169
RFS961
RFS123
ILAI123
RFS872
Car plate recognition script
- 1st it connects to ip-camera and downloads a snapshot.
- then it renames the snapshot.cgi to .jpg file
- Next step is converting(zooming) the image. This step you should configure by yourself. In my case i used “crop 45%” because my camera was placed to high over the gates. So i needed to zoom the photo so the script could recognize the car plate.
- Rest i hope is clear.
#! /bin/bash
wget -q http://login:password@ipadress/cgi-bin/snapshot.cgi -O /home/user/Downloads/autocheck/snapshot.cgi
mv /home/user/Downloads/autocheck/snapshot.cgi /home/user/Downloads/autocheck/snapshot.jpg
convert /home/user/Downloads/autocheck/snapshot.jpg -gravity Center -crop 45%\! /home/user/Downloads/autocheck/output.jpg
FILENAME=$(alpr -c eu -d -n 1 /home/user/Downloads/autocheck/output.jpg |awk '{print $2}' | awk 'FNR>=2 && FNR<=4')
if grep -Fxq "$FILENAME" /home/user/Downloads/autocheck/numbers.txt
then
echo CAR FOUND!, opening the gates! | while IFS= read -r line; do echo "$FILENAME, $(date) $line"; done >>/home/user/Downloads/autocheck/log.txt
sh /home/user/Downloads/autocheck/relay-control/open.sh 2> /dev/null
sh /home/user/Downloads/autocheck/tg.sh xGates "Car Found! Welcome" > log.out 2> /dev/null
sh /home/user/Downloads/autocheck/tg.sh xGates $FILENAME > log.out 2> /dev/null
sh /home/user/Downloads/autocheck/tgphoto.sh xGates /home/user/Downloads/autocheck/output.jpg > log.out 2> /dev/null
sleep 20
sh /home/user/Downloads/autocheck/relay-control/open.sh 2> /dev/null
elif [ -n "$FILENAME" ]; #if not empty
then
echo Unregistered car is at the gates! | while IFS= read -r line; do echo "$FILENAME, $(date) $line"; done >>/home/user/Downloads/autocheck/log.txt
sh /home/user/Downloads/autocheck/relay-control/open.sh 2> /dev/null
sh /home/user/Downloads/autocheck/tg.sh xGates "Unregistered car is at the gates!" > log.out 2> /dev/null
sh /home/user/Downloads/autocheck/tg.sh xGates $FILENAME > log.out 2> /dev/null
sh /home/user/Downloads/autocheck/tgphoto.sh xGates /home/user/Downloads/autocheck/output.jpg > log.out 2> /dev/null
sleep 20
sh /home/user/Downloads/autocheck/relay-control/open.sh 2> /dev/null
else
2> /dev/null
fi
sleep 1
exec bash "$0"
Telegram bot and script
Open Telegram app, search for @BotFather and start the chat. Send /newbot command and follow the instructions. After completing the initial steps, you’ll get your TOKEN
- Create python script and save it as bot.py
# -*- coding: utf-8 -*-
import config
import telebot
import os
import time
import requests
import subprocess
import simplejson
import sys
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telebot import types
bot = telebot.TeleBot(config.token)
@bot.message_handler(content_types=["text"])
def any_msg(message):
keyboard = types.InlineKeyboardMarkup()
callback_button1 = types.InlineKeyboardButton(text="Gate-1", callback_data="open")
callback_button2 = types.InlineKeyboardButton(text="Gate-2", callback_data="open2")
callback_button3 = types.InlineKeyboardButton(text="Photo", callback_data="photo")
# callback_button3 = types.InlineKeyboardButton(text="Add car", callback_data="add")
keyboard.add(callback_button1,callback_button2,callback_button3)
bot.send_message(message.chat.id, "Welcome to the xGates", reply_markup=keyboard)
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
if call.message:
if call.data == "open":
os.system("cat </dev/null |sh /home/user/Downloads/autocheck/relay-control/open.sh 2>/dev/null")
if call.message:
if call.data == "open2":
os.system("cat </dev/null |sh /home/user/Downloads/autocheck/relay-control/open2.sh 2>/dev/null")
if call.message:
if call.data == "photo":
os.system("sh /home/user/Downloads/autocheck/tgphoto.sh xGates /home/user/Downloads/autocheck/output.jpg > log.out 2> /dev/null")
if call.message:
if call.data == "close":
os.system("cat </dev/null |sh /home/user/Downloads/autocheck/relay-control/close.sh 2>/dev/null")
if call.message:
if call.data == "add":
os.system("cat </dev/null |sh /home/user/Downloads/autocheck/relay-control/add.sh 2>/dev/null")
def run(self):
while True:
self.updates()
time.sleep(1)
if __name__ == '__main__':
bot.polling(none_stop=True)
- Create in the same directory config.py and paste there your TOKEN which you got from @Botfather.
# -*- coding: utf-8 -*-
token = 'TOKEN'
Run it
Check all the paths in scripts and run.
sh check.sh
python bot.py
Schematics
Source: Smart Gates