QR Code با Raspberry Pi و OpenCV (کد پاسخ سریع) نوعی با‌رکد ماتریس است که شامل اطلاعاتی درباره موردی می‌باشد که به آن وصل شده است، مانند داده‌های مکان، شناسه یا ردیابی که یک وب‌سایت یا برنامه را شناسایی می‌کند. یک دستگاه نوری قابل خواندن با ماشین است. این یک برچسب نوری قابل خواندن با ماشین است که به شکل تصویر 2D می‌باشدو الگوی متفاوتی دارد.

در این آموزش قصد داریم با استفاده از کتابخانه‌های OpenCV و ZBar اسکنر QR Code را برپایه Raspberry Pi بسازیم. ZBar بهترین کتابخانه برای تشخیص و رمزگشایی انواع بارکد و کدهای QR است. OpenCV برای گرفتن یک قاب جدید از یک جریان ویدیویی و پردازش آن استفاده می‌شود. هنگامی‌که OpenCV یک قاب را می‌گیرد، می‌توانیم آن را به یک کتابخانه رمزگشایی بارکد مخصوص پایتون مانند ZBar که بارکد را رمزگشایی کرده و آن را به اطلاعات مربوطه تبدیل می‌کند، منتقل کنیم.

ابزار لازم برای ساخت QR Code با Raspberry Pi و OpenCV

  • Raspberry Pi 3 (هر نسخه‌ای)
  • ماژول دوربین پی

قبل از شروع کار با این اسکنر Raspberry Pi 3 QR code، ابتدا باید OpenCV، کتابخانه رمزگشایی بارکد ZBar ،imutils و برخی از وابستگی‌های دیگر را در این پروژه نصب کنیم. OpenCV در اینجا برای پردازش تصویر دیجیتال استفاده می‌شود. متداول‌ترین کاربردهای پردازش تصویر دیجیتال تشخیص شیء، تشخیص چهره و شمارنده افراد است.

نصب OpenCV در Raspberry Pi

در اینجا از کتابخانه OpenCV برای اسکنر Raspberry Pi QR استفاده می‌شود. برای نصب OpenCV، ابتدا Raspberry Pi را به روز کنید.

sudo apt-get update

سپس برای نصب OpenCV در Raspberry Pi وابستگی‌های لازم را نصب کنید.

sudo apt-get install libhdf5-dev -y 
sudo apt-get install libhdf5-serial-dev –y 
sudo apt-get install libatlas-base-dev –y 
sudo apt-get install libjasper-dev -y 
sudo apt-get install libqtgui4 –y
sudo apt-get install libqt4-test –y

پس از آن با استفاده از دستور زیر OpenCV را در Raspberry Pi نصب کنید.

pip3 install opencv-contrib-python==4.1.0.25

نصب بسته‌های موردنیاز QR Code با Raspberry Pi و OpenCV

نصب ZBar

Zbar بهترین کتابخانه برای کشف و رمزگشایی انواع بارکد و کدهای QR است. برای نصب كتابخانه از دستور زیر استفاده كنید:

pip3 install pyzbar

نصب imutils

از imutils برای ایجاد توابع مهم پردازش تصویر مانند ترجمه، چرخش، تغییر اندازه، اسكلت و نمایش تصاویر Matplotlib با OpenCV آسان‌تر استفاده می‌شود. برای نصب imutils از دستور زیر استفاده کنید:

pip3 install imutils

نصب argparse

برای نصب کتابخانه argparse از دستور زیر استفاده کنید. argparse مسئول تجزیه آرگومان‌های خط فرمان است.

pip3 install argparse

تنظیم سخت افزار Raspberry pi QR Code Reader

در اینجا ما فقط به Raspberry Pi و دوربین Pi برای این اسکنر کد QR با استفاده از Raspberry Pi Camera احتیاج داریم و شما فقط باید اتصال روبان دوربین را در شکاف دوربین داده شده در Raspberry pi وصل کنید.

تنظیم سخت‌افزار Raspberry pi QR Code Reader:

از دوربین Pi می‌توان برای ساخت پروژه‌های جالب مختلف مانند دوربین نظارت تصویری Raspberry Pi، سیستم مانیتورینگ بازدید‌کننده، سیستم امنیتی خانگی و غیره استفاده کرد.

کد پایتون برای Raspberry Pi QR Code Reader

کد کامل Reader Raspberry Pi QR در انتهای صفحه آورده شده است. قبل از اینکه Raspberry Pi را برنامه‌ریزی کنیم، اجازه دهید کد را بفهمیم. بنابراین، طبق معمول، کد را با وارد کردن تمام بسته‌های مورد نیاز شروع کنید.

from imutils.video import VideoStream
from pyzbar import pyzbar
import argparse
import datetime
import imutils
import time
import cv2

سپس آرگومان‌های تجزیه‌کننده را ایجاد کنید و آرگومان‌ها را تجزیه کنید. آرگومان Command-line حاوی اطلاعاتی در مورد مسیر فایل CSV است. فایل CSV (مقادیر جدا شده با ویرگول) شامل زمان‌سنج می‌باشد.

ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", type=str, default="barcodes.csv",
            help="path to output CSV file containing barcodes")
args = vars(ap.parse_args())

در صورت استفاده از وب‌کم USB، جریان ویدیو را تنظیم کنید و خط کامنت رو از کامنت دربیاورید.

#vs = VideoStream(src=0).start()
vs = VideoStream(usePiCamera=True).start()
time.sleep(2.0)

اکنون درون حلقه، یک قاب را از جریان فیلم بگیرید و اندازه آن را به 400 پیکسل تغییر دهید. پس از گرفتن قاب، با استفاده از عملکرد pyzbar.decode، کد QR را کشف و رمزگشایی کنید.

frame = vs.read()
frame = imutils.resize(frame, width=400)
barcodes = pyzbar.decode(frame)

اکنون، برای بارکد‌های شناسایی شده QR Code با Raspberry Pi و OpenCV، حلقه بزنید تا محل بارکد را استخراج کرده و جعبه اتصال را دور بارکد روی تصویر بکشید.

for barcode in barcodes:
        (x, y, w, h) = barcode.rect
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)

بارکد‌های شناسایی

سپس بارکد شناسایی شده را با استفاده از عملکرد رمزگشایی (“utf-8”) در یک رشته “utf-8” رمزگشایی کرده و با استفاده از عملکرد barcode.type نوع بارکد را استخراج کنید.

barcodeData = barcode.data.decode("utf-8")
barcodeType = barcode.type

پس از آن، داده‌های بارکد استخراج شده و نوع بارکد را درون یک متغیر به نام متن ذخیره کنید و داده‌های بارکد را بکشید و روی تصویر تایپ کنید.

text = "{} ({})".format(barcodeData, barcodeType)
cv2.putText(frame, text, (x, y - 10),
     cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

اکنون خروجی QR Code با Raspberry Pi و OpenCV را با داده بارکد و نوع بارکد نمایش دهید.

cv2.imshow("Barcode Reader", frame)

اکنون در مرحله آخر QR Code با Raspberry Pi و OpenCV، بررسی کنید که آیا کلید مورد فشار قرار گرفته است، سپس حلقه اصلی را جدا کرده و روند پاکسازی را شروع کنید.

key = cv2.waitKey(1) & 0xFF
# if the `s` key is pressed, break from the loop
if key == ord("s"):
        break
print("[INFO] cleaning up...")
csv.close()
cv2.destroyAllWindows()
vs.stop()

تست اسکنر کد QR Code با Raspberry Pi و OpenCV

پس از آماده شدن QR Code با Raspberry Pi و OpenCV، برنامه Reader QR code را راه اندازی کنید. پنجره‌ای را مشاهده خواهید‌کرد که یک دوربین مستقیم از دوربین خود نمایش می‌دهد، حالا می‌توانید بارکد را در مقابل دوربین PI ارائه دهید. هنگامی که Pi رمز بارکد را رمزگشایی می‌کند، یک جعبه قرمز در اطراف آن با داده‌های بارکد و نوع بارکد مانند تصویر زیر نشان می‌دهد:

تست اسکنر کد QR Code با Raspberry Pi و OpenCV

برای QR Code با Raspberry Pi و OpenCV اینگونه است که می‌توانید فقط با استفاده از بورد Raspberry Pi و دوربین Pi یا دوربین USB به راحتی Raspberry Pi Camera QR Code Reader بسازید.

from pyzbar import pyzbar
import argparse
import datetime
import imutils
import time
import cv2
 
ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", type=str, default="barcodes.csv",
help="path to output CSV file containing barcodes")
args = vars(ap.parse_args())
#vs = VideoStream(src=0).start()  #Uncomment this if you are using Webcam
vs = VideoStream(usePiCamera=True).start() # For Pi Camera
time.sleep(2.0)
csv = open(args["output"], "w")
found = set()
 
while True:
frame = vs.read()
frame = imutils.resize(frame, width=400)
barcodes = pyzbar.decode(frame)
for barcode in barcodes:
(x, y, w, h) = barcode.rect
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
barcodeData = barcode.data.decode("utf-8")
barcodeType = barcode.type
text = "{} ({})".format(barcodeData, barcodeType)
        print (text)
cv2.putText(frame, text, (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
 
# if the barcode text is currently not in our CSV file, write
# the timestamp + barcode to disk and update the set
if barcodeData not in found:
csv.write("{},{}n".format(datetime.datetime.now(),
barcodeData))
csv.flush()
found.add(barcodeData)
cv2.imshow("Barcode Reader", frame)
key = cv2.waitKey(1) & 0xFF
 
# if the `s` key is pressed, break from the loop
if key == ord("s"):
break
print("[INFO] cleaning up...")
csv.close()
cv2.destroyAllWindows()
vs.stop()</pre>