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 وصل کنید.
از دوربین 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 اینگونه است که میتوانید فقط با استفاده از بورد 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>