Zephyrnet-logo

Bouw een gebruikersauthenticatiesysteem met QR-codescanner met OpenCV

Datum:

Dit artikel is gepubliceerd als onderdeel van het Data Science-blogathon.

Computer Vision heeft een overvloed aan mogelijkheden geopend en een van de eenvoudigste en meest populaire dagelijkse toepassingen is het gebruik van QR-codes en streepjescodescanners.

QR-codescanner met OpenCV

( Source: https://i.pinimg.com/736x/bb/55/b1/bb55b1a42f4e2cf6e80a0e275ad8b0c8.jpg )

Wat gebeurt er als je bij de kassa van de supermarkt staat? De kassier scant elk artikel in uw winkelmandje met een apparaat en vervolgens worden de prijzen automatisch in het systeem geregistreerd om uw factuur te genereren. Dat apparaat is niets anders dan een QR/Barcodescanner en dat is precies wat we vandaag gaan bouwen!

Voordat we in de code duiken, willen we eerst een idee krijgen van QR-codes en hun gebruik.

Wat zijn QR-codes?

QR-code staat voor Quick Response Code. Het is een matrixtypecode die in de volksmond wordt gebruikt om items bij te houden. QR-codes slaan gegevens op in de vorm van pixels die overeenkomen met binaire codes die kunnen worden geïnterpreteerd om de daadwerkelijke gegevens te onthullen.

Dit is de basisstructuur van een QR-code.

QR-codes

(Bron: https://en.wikipedia.org/wiki/File:QR_Code_Structure_Example_3.svg)

QR-codes vinden hun toepassing op verschillende gebieden, zoals:

  1. Identificatie en authenticatie als gebruikers (ID-kaarten)
  2. Individuele artikelen volgen (Voorraadbeheer)
  3. Betalingsgegevens delen (GPay, Paytm)
  4. Deel links, foto's, media

Een van de belangrijkste voordelen van QR-codes is dat de gegevens in gecodeerde vorm kunnen worden gedeeld zonder dat de gecodeerde gegevens expliciet openbaar hoeven te worden gemaakt. Dit fungeert als een extra beschermingslaag om misbruik van gevoelige informatie te voorkomen.

Streepjescodes zijn net als QR-codes ook machinaal leesbare gecodeerde codes, maar in tegenstelling tot QR-codes worden de gegevens gecodeerd in de vorm van staven met verschillende afstanden en diktes. Een QR-code wordt beschouwd als een 2D-streepjescode, omdat deze zowel horizontaal als verticaal gegevens kan opslaan, in tegenstelling tot een streepjescode die gegevens gewoonlijk in horizontale richting opslaat. QR-codes zijn dus krachtiger dan streepjescodes.

Nu we weten wat QR-codes zijn, gaan we aan de slag met onze Python-code.

De bibliotheken importeren

Voor ons project gaan we OpenCV gebruiken om afbeeldingen te lezen, videostreaminvoer te nemen en ook onze uitvoer weer te geven. De belangrijkste bibliotheken die we nodig hebben zijn de Pizbar en zbar bibliotheken om onze gecodeerde QR-codes te decoderen. Dit zijn open-source Python-bibliotheken die helpen bij het decoderen van streepjescodes en QR-codes. We hebben ook onze NumPy-bibliotheek nodig. Wij moeten de nodige installaties maken.

importeer numpy als np uit pyzbar.pyzbar import decode import cv2

De code van een afbeelding scannen

Eerst zullen we de afbeelding van een QR-code lezen die is opgeslagen in ”qr1.png” met behulp van de cv2-bibliotheek. Laten we vervolgens met behulp van de decodeermethode van pyzbar proberen onze code te decoderen en de resultaten te analyseren.

Dit is de QR-code die we zullen gebruiken als “qr1.png”

QR-codescanner met OpenCV

(Bron: VectorStock.com/26810014)

#QR-code lezen van een afbeelding img = cv2.imread("qr1.png") code = decode(img) print(code)

uitgang:

Uitvoer | QR-codescanner met OpenCV

Er wordt nu veel informatie weergegeven. Laten we elk deel van onze output begrijpen.

gegevens -> Dit veld geeft ons de tekst of de informatie gecodeerd in de QR-code

typ -> Dit veld vertelt ons het type code QRCODE of BARCODE

rect -> Dit geeft de linker-, boven-, breedte en hoogte van de rechthoek die de QR-afbeelding omsluit. Zelfs als de QR-code wordt gekanteld, blijft de rechthoek rechtop staan, waardoor we een rechthoek krijgen die de hele QR-code omsluit

veelhoek -> Dit geeft ons de exacte hoekpunten van de polygoon rond de QR-afbeelding. Als de afbeelding van de QR-code gekanteld is, geldt dat ook voor de polygoon die deze begrenst.

Dit is de reden waarom we de coördinaten van de veelhoek zullen gebruiken om ons grenskader te tekenen, zodat we, zelfs als de QR-code wordt geroteerd, de exacte grens van de code krijgen.

Nu kan een foto meerdere QR-codes hebben. Laten we dus onze code in een for-lus plaatsen, zodat deze alle streepjescodes in onze afbeelding kan detecteren. Omdat we vooral geïnteresseerd zijn in de gecodeerde informatie, laten we alleen de gecodeerde tekst weergeven.

voor streepjescode in decode(img): print(barcode.data) #in bytes tekst = barcode.data.decode('utf-8') print(tekst) print(barcode.rect)

uitgang

Uitgang 2 | QR-codescanner met OpenCV

De eerste regel met uitvoer toont b'Hello! '. De b betekent dat het een letterlijke bytes is. Het wordt later gedecodeerd met behulp van het 'utf-8'-schema om alleen de str-tekst te verkrijgen.

Geweldig! Nu hebt u met succes de gecodeerde tekst van een QR-code gedecodeerd.

QR-codes in realtime decoderen

Laten we nu proberen dit in realtime te doen met behulp van camerafeedinvoer. Voor de meeste toepassingen in de praktijk, zoals QR-codescanners in een supermarkt, gebruikersauthenticatie of het volgen van een object, moeten we een code in realtime decoderen. Dus laten we beginnen!

Met het volgende stukje code kunnen we de webcam inschakelen en een secundair venster voor de uitvoer maken.

#QR-code scannen uit camerafeed vid = cv2.VideoCapture(0) vid.set(3,640) vid.set(4,740)

Terwijl de video aan staat, gaan we nu de QR-codes in het frame decoderen zoals we eerder deden. Daarnaast zullen we de polygoonpunten ook gebruiken om de selectiekaders rond onze QR-codes te tekenen en de bijbehorende gedecodeerde tekst op de cameraframe-invoer zelf weer te geven.

while True: succes, img = vid.read() voor barcode in decode(img): text = barcode.data.decode('utf-8') print(text) polygon_Points = np.array([barcode.polygon], np.int32) polygon_Points=polygon_Points.reshape(-1,1,2) rect_Points= barcode.rect cv2.polylines(img,[polygon_Points],True,(255,255, 0), 5) cv2.putText(img, text, (rect_Points[0],rect_Points[1]), cv2.FONT_HERSHEY_DUPLEX, 0.8, (255,255, 0), 2) cv2.imshow("Video", img) cv2.waitKey(1)

uitgang

Uitgang 3 | QR-codescanner met OpenCV

In het bovenstaande stukje code wordt de regel

cv2.polylines(img,[polygon_Points],True,(255,255, 0), 5)

toont het selectiekader rond onze QR-code. 'img' specificeert het invoerframe. Merk op dat we hier de polygoonpunten gebruiken, zodat zelfs als de QR-code wordt geroteerd, we het exacte selectiekader krijgen. (255,255,0) specificeert de kleur van het selectiekader en 5 geeft de dikte aan.

De coderegel

cv2.putText(img, tekst, (rect_Points[0],rect_Points[1]), cv2.FONT_HERSHEY_DUPLEX, 0.8, (255,255, 0), 2)

wordt gebruikt om de gedecodeerde tekst weer te geven. Als je goed kijkt, zul je zien dat we hier de coördinaten van de rechthoek hebben gebruikt in plaats van de veelhoek om de tekst weer te geven. De reden hiervoor is om ervoor te zorgen dat de tekst rechtop wordt weergegeven, ongeacht of de QR-code wordt gedraaid of niet, zodat deze beter leesbaar is.

Deze output zal ons de vergelijkende resultaten laten zien wanneer de QR-code rechtop staat en wanneer deze schuin voor de camera wordt gehouden.

Videotesten | QR-codescanner met OpenCV

Laten we het uitproberen op een aantal objecten uit de echte wereld en kijken of het werkt!

videotesten op echte dingen

Het doet! Test gerust met zoveel QR-codes als je om je heen kunt vinden!

Een ander interessant kenmerk is dat deze bibliotheek niet alleen QR-codes kan decoderen, maar ook streepjescodes, zonder enige wijziging aan onze code aan te brengen!

Laten we de resultaten bekijken met de invoer van een barcodecamera.

Testen van streepjescodes | QR-codescanner met OpenCV

Voila! U hebt nu uw streepjescode- en QR-codescanner gebouwd met behulp van enkele eenvoudige OpenCV-functies en de pyzbar-bibliotheek!

Nu voor het leuke gedeelte! Riemen vast!

Het bouwen van een gebruikersauthenticatiesysteem

Laten we een realistisch gebruiksscenario nemen.

Elke medewerker van een bedrijf krijgt een identiteitskaart met de bijbehorende QR-codes. Sommige medewerkers die aan een speciaal project werken, hebben toegang gekregen tot een specifiek laboratorium, terwijl dit voor anderen een verboden zone is. Elke medewerker moet bij de ingang zijn identiteitskaart scannen om toegang te krijgen tot de laboratoria.

We hebben al onze QR-codescanner. Laten we nu alles wat we tot nu toe hebben geleerd, gebruiken. We gaan een eenvoudig gebruikersauthenticatiesysteem bouwen, dat controleert of een QR-code toebehoort aan geautoriseerd personeel en beslist of deze toegang wordt verleend of niet.

Dus laten we aan de slag gaan met de code!

importeer numpy als np uit pyzbar.pyzbar import decode import cv2
#QR-code scannen uit camerafeed vid = cv2.VideoCapture(0) vid.set(3,640) vid.set(4,740)

De bibliotheken zijn geïmporteerd en de video-opname is ingesteld. Nu moeten we het tekstbestand met de gedecodeerde QR-codeteksten voor geautoriseerde medewerkers lezen en deze in een lijst opslaan.

Authenticatiesysteem

Dit is ons tekstbestand “Authorised.txt”

met open('Authorised.txt', 'r') als bestand: auth_list = file.read().strip() print(auth_list)

uitgang

uitgang

Laten we ter referentie de vorige code op onze invoerafbeelding uitvoeren om de gedecodeerde tekst voor elke QR-code weer te geven. We zullen dit later nodig hebben om te verifiëren of ons model correct werkt of niet. Laten we eens kijken naar de output die we krijgen.

uitgang

Video-uitgang

Nu hoeven we alleen nog maar voor elke QR-code te controleren of de gedecodeerde tekst aanwezig is in de lijst met geautoriseerde mensen. Als er een overeenkomst is, gebruiken we een groene kleur (0,255,0) voor ons selectiekader en geven we de tekst 'Toegang verleend' weer. Anders gebruiken we een rode kleur (0,0, 255) en geven we het bericht weer “Ongeautoriseerde toegang”.

while True: succes, img = vid.read() voor barcode in decode(img): text = barcode.data.decode('utf-8') text=str(text) als tekst niet in auth_list: color=(0,0,255 ,0,255,0) displaytext = "Ongeautoriseerde toegang" else: color=(32) displaytext = "Toegang verleend" polygon_Points = np.array([barcode.polygon], np.int1,1,2) polygon_Points=polygon_Points.reshape(-2 ,3) rect_Points= barcode.rect cv2.polylines(img,[polygon_Points],True,color, 0) cv1.putText(img, displaytext, (rect_Points[2],rect_Points[0.9]), cv2.FONT_HERSHEY_PLAIN, 2, kleur, 2) cv1.imshow("Video", img) cvXNUMX.waitKey(XNUMX)

uitgang

Toegang verleend of niet

Een pluim! Je hebt het gedaan!

Ons model scant perfect de QR-codes en verleent alleen toegang aan geautoriseerde medewerkers! U hebt met succes een gebruikersauthenticatiesysteem gebouwd met behulp van de QR-codescanner die alleen toegang verleent aan geautoriseerde medewerkers zodra ze de QR-codes op hun identiteitskaarten scannen!

Er zijn eindeloze velden waarin QR-codes erg nuttig kunnen zijn. Dus ga je gang en veel plezier met het experimenteren met verschillende codes en hun toepassingen!

Over mij:

Hé, ik ben Tithi Sreemany. Ik hoop dat je dit artikel leuk vond om te lezen en het nuttig vond!

U kunt contact met mij opnemen op LinkedIn.

Bekijk hier mijn andere artikelen: link.

Bedankt voor het lezen!

De in dit artikel getoonde media zijn geen eigendom van Analytics Vidhya en worden naar goeddunken van de auteur gebruikt. 

Bron: https://www.analyticsvidhya.com/blog/2022/01/build-a-user-authentication-system-with-qr-code-scanner-using-opencv/

spot_img

Laatste intelligentie

spot_img

Chat met ons

Hallo daar! Hoe kan ik u helpen?