'How to use PYZBAR to decode QR code OpenCV - Python?
I'm using python PYZBAR to decode QR code captured by real time cam.
decode(input_frame)
Naturally the output I get is as follows
[Decoded(data=b'DATA', type='QRCODE', rect=Rect(left=50, top=179, width=255, height=254), polygon=[Point(x=50, y=433), Point(x=305, y=424), Point(x=302, y=180), Point(x=51, y=179)], quality=1, orientation='UP')]
the output shows:
- The data stored in the QR Code.
- Code type (QRCODE).
- The position of each corner of the QR Code in the frame.
- Quality.
- And the orientation of the QR Code (whether it up, down, left or right).
I'm only concerned about the data stored in the QR Code and its Orientation
How can I define them as a variable to use them later, something like the following pseudo code:
x = orientation y = data stored in QR Code
if x == up && y == DATA:
...........
My goal is to read and decode QR Code data and orientation to navigate a robot like the video provided in the link.
Solution 1:[1]
solved the issue, this is the new code
from pyzbar.pyzbar import decode
import cv2
import serial
import time
arduino = serial.Serial(port='COM6', baudrate=115200, timeout=1)
cap = cv2.VideoCapture(0)
def write_read(x):
arduino.write(bytes(x, 'utf-8'))
time.sleep(0.05)
data = arduino.readline()
return data
def get_qr_data(input_frame):
try:
return decode(input_frame)
except:
return []
while True:
_, frame = cap.read()
qr_obj = get_qr_data(frame)
try:
data = qr_obj[0].data
angle = qr_obj[0].orientation
print(data)
print(angle)
except IndexError:
pass
cv2.imshow("DD", frame)
if qr_obj == get_qr_data(frame):
arduino.write(b'O')
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Solution 2:[2]
You figured out a solution to your problem. Let me show you something that exists within OpenCV
OpenCV also has an in-built function to detect QR codes since version 4.x
. There is a dedicated module for this purpose cv2.QRCodeDetector()
. It gives you:
- data associated with QR code
- location of it
You can also detect QR code on a curved surface using cv2.QRCodeDetector().decodeCurved()
And multiple QR codes in an image using cv2.QRCodeDetector(). decodeMulti()
To get more info on the same, type the following and execute
help(cv2.QRCodeDetector())
Also refer this useful blog post
Also refer to this recent answer by Christoph Rackwitz
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Omar Diaa |
Solution 2 | Jeru Luke |