پروژه پلاک خوان با رسپبری پای ، پایتون ، PHP و ربات تلگرام !

در این پروژه ، می خواهیم برنامه ای طراحی کنیم که با استفاده از رسپبری پای پلاک خودرو ها را تشخیص داده و گیت را برای خودرو های مجاز باز کرده و تصویر خودرو ها را از طریق ربات تلگرام برای شما ارسال کند!

فرایند به این صورت انجام می شود :

  • ماشین به سمت گیت ورودی حرکت می کند.
  • دوربین شماره پلاک خودرو را می خواند.
  • شماره خوانده شده را با پایگاه داده مطابقت داده می شود، اگر شماره ی خودرو از قبل ثبت شده بود گیت را باز می کند و اجازه می دهد ماشین عبور کند.
  • از هر خودرو در مقابل گیت عکس گرفته شده ، سپس عکسی با شماره پلاک خودرو و وضعیت آن به اپلیکیشن تلگرام ارسال می شود.
  • ربات تلگرام توانایی باز و بسته کردن گیت ها، گرفتن عکس و افزودن اتومبیل جدید به پایگاه داده را دارد.
  • این کار با پایتون ، پوسته Bash و ربات تلگرام انجام می شود

همچنین بر روی یک رابط وب کار می کنیم که قابلیت های زیر را داشته باشند:

  1. گیت های ورودی را باز کند / مکث کند و ببندد
  2. اضافه کردن / حذف / ویرایش / مسدود کردن خودرو ها
  3. اضافه کردن / حذف / ویرایش / مسدود کردن آی پی های دوربین ها
  4. تنظیم پین های GPIO را برای قطع و وصل رله ها
  5. تنظیم بزرگنمایی دوربین IP
  6. باز کردن خودکار گیت ها را فعال یا غیرفعال کند
  7. افزودن / حذف / ویرایش / مسدود کردن کاربران، تنظیم وضعیت و اختیارات مختلف برای کاربران
  8. گزارشات سیستم پلاک خوان که بتواند خودرو ها را بر اساس تاریخ و شماره پلاک جستجو کرد و بتوان از گزارشات با فرمت Excel خروجی گرفت.

آماده سازی

برای این منظور شما به رسپبری پای ۳ یا ۴ با نصب Ubuntu Mate نیاز دارید که می توانید آن را از اینجا دریافت کنید.

نصب کتابخانه پلاک خوان

کتابخانه را از طریق کد زیر نصب کنید

sudo apt-get update && sudo apt-get install -y openalpr openalpr-daemon openalpr-utils libopenalpr-dev

ImageMagick را نصب کنید

sudo apt-get install imagemagick

نصب ملزومات ربات تلگرام

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

نصب Telegram-cli

برای نصب و پیکربندی telegram-cli در  ubuntu این لینک را دنبال کنید.

اتصال رله ها

رله ها را به رسپبری پای وصل کنید.

ما در این پروژه  از پین GPIO23 برای رله اول و GPIO26 برای رله دوم استفاده می کنیم.

می توانید رله را با اسکریپت shell آزمایش کنید ، فقط یک اسکریپت ساده sh ایجاد کرده و آن را اجرا کنید:

nano open.sh
chmod +x open.sh
sh open.sh

کد زیر را جایگذاری کنید و آن را اجرا کنید.

کد اسکریپت برای رله اول :

#!/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

کد اسکریپت برای بازپخش دوم :

#!/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

پلاک اتومبیل

رله ها را به گیت متصل کنید

نرم افزار پلاک خوان
پلاک خوان2

اسکریپت ارسال پیام در تلگرام

اسکریپت .sh را با کد زیر ایجاد کنید:

#!/bin/bash 
 to=$1 
 msg=$2 
 tgpath=/home/user/tg 
 cd ${tgpath} 
 (sleep 1; echo "dialog_list";sleep 1; echo "msg $to $msg";) | ${tgpath}/bin/telegram-cli -k -W tg-server.pub 

اسکریپت ارسال عکس در تلگرام

اسکریپت .sh را با کد زیر ایجاد کنید:

#!/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 

۲ فایل برای اسکریپت شناسایی اصلی ایجاد کنید :

touch log.txt
touch numbers.txt

در number.txt تمام شماره های شناخته شده پلاک خودرو را اضافه کنید.

ترتیب numbers.txt باید به صورت زیر باشد:

YZO169

RFS961

RFS123

ILAI123

اسکریپت تشخیص پلاک ماشین

 اول سیستم  پلاک خوان به دوربین IP پلاک خوان متصل می شود و یک عکس را دریافت می کند.

سپس پسوند فایل snapshot.cgi را به .jpg تغییر می دهد.

مرحله بعدی تبدیل (بزرگنمایی) تصویر است.

این مرحله را باید خودتان پیکربندی کنید.

در این مورد از “برش ۴۵٪” استفاده شده زیرا دوربین به کار گرفته شده بالای گیت ورودی قرار دارد بنابراین لازم بود عکس بزرگنمایی شود تا اسکریپت بتواند پلاک ماشین را تشخیص دهد.

#! /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 
۲> /dev/null 
fi 
sleep 1 
exec bash "$0"  

ربات تلگرام و اسکریپت آن

تلگرام را باز کنید و @BotFathe را جستجو کنید. چت را شروع کرده و دستور /newbot را ارسال کنید و بقیه مراحل ساخت آن را پیش بروید. پس از انجام مراحل اولیه ساخت ربات، شما یک توکن دریافت می کنید.

یک اسکریپت پایتون ایجاد کرده و آن را با نام 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) 

در همان آدرس یک فایل دیگر به نام config.py ایجاد کرده و توکنی که از @bofather دریافت می کنند را در آن پیست کنید.

# -*- coding: utf-8 -*- 
token = 'TOKEN' 

کد را اجرا کنید

تمام آدرس های داخل اسکریپت را بررسی کرده و کد را اجرا کنید.

sh check.sh
python bot.py

اگر تمام مراحل را به صورت گفته شده پیش رفته باشید باید بتوانید در نهایت پروژه پلاک خوان خود را اجرا کرده و به راحتی از آن استفاده کنید. لطفا نظر خود را در مورد این پروژه به ما اعلام کنید.

نتیجه

نتیجه کد برای پنل وب به صورت زیر است.

کنترل گیت با پلاک خوان و پنل وب

و نتیجه ای که توسط ربات در تلگرام برای ما ارسال می شود به صورت زیر است.

کنترل گیت با پلاک خوان و تلگرام

دمای کار برد رسپبری پای در هنگام پلاک خوانی به صورت زیر است.

دمای برد رسپبری پای : ۶۸٫۲C

میزان بار پردازشی CPU در هنگام پلاک خوانی : ۴۰%

در پایین نیز اطلاعات کامل برد رسپبری پای نشان داده شده است.

اطلاعات برد رسپبری پای در هنگام پلاک خوانی

تشخیص پلاک های ایرانی

روش گفته شده در بالا تنها برای پلاک های خارجی کاربرد دارد و لیست پلاک ها باید به صورت دستی وارد نرم افزار شود. اما برای پلاک های ایرانی و به عنوان یک پروژه با درصد اطمینان بالا، شرکت دانش بنیان شهاب محصول پلاک خوان خود را برای اجرا روی برد های رسپبری پای و جتسون نانو عرضه کرده است.

نرم افزار پلاک خوان آی پلاک لینوکس به عنوان یک محصول در رده تجاری برای پیاده سازی روی سیستم های لینوکس محور عرضه شده که به طور ویژه برای برد های مینی کامپیوتر لینوکسی مانند رسپبری پای و جتسون نانو توسعه یافته است. این نرم افزار با نصب بر روی برد های پردازنده، تصویر دوربین های مداربسته را دریافت کرده و به صورت Real-Time پلاک خوانی را انجام می دهد. در نهایت نتیجه ی پلاک خوانی به همراه ساعت دقیق تشخیص تردد گزارش می شود.

نرم افزار پلاک خوان آی پلاک لینوکس

شما می توانید از طریق این نرم افزار، شماره پلاک خودرو های ایرانی را تشخیص داده و از گزارش خروجی آن در پروژه های خود استفاده کنید.

بیشتر بخوانید:

منبع hackaday.io

درباره‌ی علی قلی زاده

همچنین ببینید

بینایی کامپیوتری در خودرو های خودران

مقدمه ای بر بینایی کامپیوتری برای خودروهای خودران

در این مقاله قصد داریم بررسی کنیم که بینایی کامپیوتری (Computer Vision) چیست و چگونه …

2 نظر

  1. سلام خسته نباشید فقط کاش یک کلیپ هم آماده کنید که نحوه نصب رله ها رو آموزش میدادین خیلی ممنون

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.