Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- DEMOUKÁZKA
- jak pomocí OpenCV přečíst hodnotu v QR kódu a zároveň vrátit orientaci QR kódu podle směrnice.
- Vypíše směrnici QR kódu jako úhel 0°- 360°
- Vypíše světovou stranu, na kterou je QR kód natočen
- """
- import cv2 as cv
- import numpy as np
- import math
- # Nastavím si testovací obrázek:
- # qr000.png (neotočen, originál míří na SEVER)
- # qr015.png (lehce pootočen o 15° PO směru hodinových ručiček)
- # qr345.png (lehce pootočen o 15° PROTI směru hodinových ručiček)
- # qr045.png (pootočen o 45° PO směru hodinových ručiček, nedává správné výsledky, protože je to hraniční hodnota a záleží, kolik desetinek doprava či doleva spočítá OpenCV ty hraniční body a tím pádem směrnici)
- IMG_FILE = 'qr015.png'
- # Když chci podrobný tisk informací o QR kódu, které předá OpenCV, nastavím True
- PODROBNY_TISK = False
- # Když chci nakreslit obrysové čáry kolem QR kódu, nastavím True
- KRESLENI = True
- im = cv.imread(IMG_FILE)
- det = cv.QRCodeDetector()
- for i in range(4):
- # postupně vyzkouším obrázek vždy pootočit o 90°, proto 4 cykly
- print("Rozměry obrázku: ", im.shape)
- retval, points, straight_qrcode = det.detectAndDecode(im)
- if points is not None:
- nrOfPoints = len(points[0])
- x0 = int(points[0][3][0])
- y0 = int(points[0][3][1])
- if KRESLENI:
- """
- Zelené kolečko je výchozí bod směrnice. Ta vede z tohoto bodu směrem k levému hornímu rohu QR kódu a tím pádem určuje "světovou" stranu, kam je QR kód natočen.
- Čáry jsou obrysy QR kódu. Prvním bodem vráceným z OpenCV je levý horní roh. Od něj začíná červená čára, která se mění v růžovou čím blíže jsou obvodové čáry k poslednímu bodu. Červená tedy ukazuje na první bod.
- Pokud chci vykresli kolečko i obrys QR kódu, nastavím konstantu KRESLENI na True.
- """
- cv.circle(im, tuple((x0, y0)), 25, (0, 250, 30), 4)
- for j in range(nrOfPoints):
- x1 = int(points[0][j][0])
- y1 = int(points[0][j][1])
- nextPointIndex = (j+1) % nrOfPoints
- x2 = int(points[0][nextPointIndex][0])
- y2 = int(points[0][nextPointIndex][1])
- cv.line(im, tuple((x1, y1)), tuple((x2, y2)), (75*j,75*j,255), 5)
- if PODROBNY_TISK:
- print("Obsah QR kódu: ", retval)
- print("Surová data na souřadnicích QR kódu: ", straight_qrcode)
- print("Typ matice se souřadnicemi: ", type(points))
- print("Počet dimenzí matice: ", points.ndim)
- print("Tvar matice: ", points.shape)
- print("Velikost matice: ", points.size)
- print("Typ hodnot uchovaný v matici: ", points. dtype)
- # print("Transformovaná matice, čili x- a y- souřadnice bodů: ", points.T)
- print("Největší prvek: ", points.max())
- print("Nejmenší prvek: ", points.min())
- # print("Index maximálních hodnot souřadnic: ", np.argmax(points))
- # print("Index minimálních hodnot souřadnic: ", np.argmin(points))
- print("Souřadnice rohů QR kódu: ", points)
- delta_x = points[0][0][0] - x0
- delta_y = y0 - points[0][0][1]
- print("Delta x: ", delta_x, " Delta y: ", delta_y)
- # Když ani jedna směrnice není kolmicí na osový systém, tzn. má obecný směr
- if bool(delta_x and delta_y):
- theta = math.atan(delta_x / delta_y)
- theta_deg = theta / math.pi * 180
- if delta_y < 0:
- theta_deg = 180 + theta_deg
- # Když směrnice ukazuje kolmo nahoru (SEVER) nebo dolů (JIH), nastala by chyba, protože tangens není pro takové hodnoty úhlu definován
- elif delta_x == 0:
- if delta_y > 0:
- theta = 0
- theta_deg = float(0)
- else:
- theta = math.pi
- theta_deg = float(180)
- # Když směrnice ukazuje kolmo doprava (VÝCHOD) nebo doleva (ZÁPAD), nastala by chyba dělením nulou, tak to musím ošetřit
- elif delta_y == 0:
- if delta_x > 0:
- theta = math.pi / 2
- theta_deg = float(90)
- else:
- theta = math.pi / 2 * 3
- theta_deg = float(270)
- # Když se pohybuji v záporných hodnotách úhlu, chci ale vidět kladné číslo
- if theta_deg < 0:
- theta = theta + math.pi * 2
- theta_deg = theta_deg + 360
- window_name = "Smernice: " + str(round(theta_deg, 2))
- if (theta_deg > 225.0) and (theta_deg <= 315.0):
- direction = "ZAPAD"
- elif (theta_deg > 45.0) and (theta_deg <= 135.0):
- direction = "VYCHOD"
- elif (theta_deg > 135.0) and (theta_deg <= 225.0):
- direction = "JIH"
- else:
- direction = "SEVER"
- window_name += " QR kod je orientovany na " + direction + ". Stiskni libovolnou klavesu pro otoceni QR kodu o 90°."
- print("Text v QR kódu: ", retval, window_name, sep=" ")
- cv.imshow(window_name, im)
- # Stiskem klávesy budeme pokračovat
- cv.waitKey(0)
- cv.destroyAllWindows()
- # Nechci znovu kreslit do už pokresleného obrázku, tak si znovu otevřu nepokreslený a otočím si ho tolikrát, kolik cyklů už proběhlo
- im = cv.imread(IMG_FILE)
- for k in range(i+1):
- im = cv.rotate(im, cv.ROTATE_90_CLOCKWISE)
Add Comment
Please, Sign In to add comment