Tips en Trucs 2023

Wazige QR codes lezen met zbar

We gaan het vandaag over zbarimg hebben (uit de zbar suite van barcode tools) en zijn vermogen om QR code afbeeldingen te lezen. Daarbij beginnen we met een leesbare QR code afbeelding en laten deze geleidelijk aan degraderen, om te zien wat er gebeurd.

Zbar en qrencode installeren

Met qrencode maken we QR code afbeeldingen en met zbar lezen we ze terug uit. Beide hulpprogramma's zijn beschikbaar in de standaard softwarebronnen van openSUSE Leap 15.4. En installeer je met de volgende opdracht:

dany@pindabook:~> sudo zypper install zbar qrencode
Gegevens van opslagruimte laden...
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

De volgende 8 NIEUWE pakketten zullen worden geïnstalleerd:
  libGraphicsMagick3-config libGraphicsMagick-Q16-3 libGraphicsMagickWand-Q16-2 libwmf-0_2-7 libzbar0
  libzbarqt0 qrencode zbar

8 nieuwe te installeren pakketten.
Totale downloadgrootte: 1,7 MiB. Reeds in de cache: 0 B. Na de bewerking zal aanvullend 5,2 MiB worden
gebruikt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
Ophalen: libGraphicsMagick3-config-1.3.35-150300.3.3.1.x86_64 (Hoofd-opslagruimte)  (1/8),  44,8 KiB    
Ophalen: libGraphicsMagick3-config-1.3.35-150300.3.3.1.x86_64.rpm ..................[gereed (1,2 KiB/s)]
Ophalen: libwmf-0_2-7-0.2.12-150000.4.4.1.x86_64 (Hoofd-opslagruimte)               (2/8), 141,3 KiB    
Ophalen: libwmf-0_2-7-0.2.12-150000.4.4.1.x86_64.rpm ...........................................[gereed]
Ophalen: libzbar0-0.23.1-1.12.x86_64 (Hoofd-opslagruimte)                           (3/8), 126,3 KiB    
Ophalen: libzbar0-0.23.1-1.12.x86_64.rpm ...........................................[gereed (1,8 MiB/s)]
Ophalen: qrencode-4.0.0-1.17.x86_64 (Hoofd-opslagruimte)                            (4/8),  49,9 KiB    
Ophalen: qrencode-4.0.0-1.17.x86_64.rpm ........................................................[gereed]
Ophalen: libGraphicsMagick-Q16-3-1.3.35-150300.3.3.1.x86_64 (Hoofd-opslagruimte)    (5/8),   1,2 MiB    
Ophalen: libGraphicsMagick-Q16-3-1.3.35-150300.3.3.1.x86_64.rpm ...................[gereed (10,8 MiB/s)]
Ophalen: libzbarqt0-0.23.1-1.12.x86_64 (Hoofd-opslagruimte)                         (6/8),  38,2 KiB    
Ophalen: libzbarqt0-0.23.1-1.12.x86_64.rpm .........................................[gereed (2,7 KiB/s)]
Ophalen: libGraphicsMagickWand-Q16-2-1.3.35-150300.3.3.1.x86_64 (Hoofd-opslagruimte)
                                                                                    (7/8),  87,2 KiB    
Ophalen: libGraphicsMagickWand-Q16-2-1.3.35-150300.3.3.1.x86_64.rpm ............................[gereed]
Ophalen: zbar-0.23.1-1.12.x86_64 (Hoofd-opslagruimte)                               (8/8),  78,5 KiB    
Ophalen: zbar-0.23.1-1.12.x86_64.rpm ...............................................[gereed (2,7 KiB/s)]

Controleren op conflicten tussen bestanden: ....................................................[gereed]
(1/8) Installeren van: libGraphicsMagick3-config-1.3.35-150300.3.3.1.x86_64 ....................[gereed]
(2/8) Installeren van: libwmf-0_2-7-0.2.12-150000.4.4.1.x86_64 .................................[gereed]
(3/8) Installeren van: libzbar0-0.23.1-1.12.x86_64 .............................................[gereed]
(4/8) Installeren van: qrencode-4.0.0-1.17.x86_64 ..............................................[gereed]
(5/8) Installeren van: libGraphicsMagick-Q16-3-1.3.35-150300.3.3.1.x86_64 ......................[gereed]
(6/8) Installeren van: libzbarqt0-0.23.1-1.12.x86_64 ...........................................[gereed]
(7/8) Installeren van: libGraphicsMagickWand-Q16-2-1.3.35-150300.3.3.1.x86_64 ..................[gereed]
(8/8) Installeren van: zbar-0.23.1-1.12.x86_64 .................................................[gereed]

We hebben als voorbeeld het volgende VCard tekstbestand gecodeerd

BEGIN:VCARD
VERSION:4.0
FN:Dany Pinoy
N:Pinoy;Dany;
ORG:Pindanet
TITLE:Oprichter
URL:https://pindanet.be
END:VCARD

Met qrencode genereren we verschillende QR code's voor elk van de foutcorrigerende niveaus, en vervolgens elk van de zwart-wit afbeeldingen grijs gemaakt met ImageMagick. Elke code had een blokgrootte van 3 pixels, de standaard van qrencode.

We maken vier QR code afbeeldingen met verschillende kwaliteiten:

dany@pindabook:~> for i in L M Q H; do qrencode -l "$i" -o bw"$i".png < pindanet; done

We converteren de aangemaakte QR code afbeeldingen van zwart-wit naar grijswaarden met de volgende ImageMagick opdrachtregel:

dany@pindabook:~> for i in L M Q H; do convert bw"$i".png -type Grayscale gray"$i".png; done

zbarimg had geen moeite met het lezen van de kleinste afbeelding, "grayL.png", hieronder getoond op zijn native 147x147 pixel grootte:

zbar
dany@pindabook:~> zbarimg grayL.png 
Name Error (Connection ":1.81" is not allowed to own the service "org.linuxtv.Zbar" due to security policies in the configuration file)
QR-Code:BEGIN:VCARD
VERSION:4.0
FN:Dany Pinoy
N:Pinoy;Dany;
ORG:Pindanet
TITLE:Oprichter
URL:https://pindanet.be
END:VCARD

scanned 1 barcode symbols from 1 images in 0,01 seconds
...

Voor vervagingstests gebruikte we de ImageMagick vervagingsfunctie, waarbij we alleen de sigma variëren in stappen van 0,1 op "grayL.png" om een reeks afbeeldingen te produceren, die hieronder als voorbeeld worden getoond.

dany@pindabook:~> for i in $(LC_ALL=C seq 0.1 0.1 3); do convert grayL.png -blur 0x"$i" grayL_"$i".png; done
zbar
Origineel
zbar
0x0.5
zbar
0x1.0
zbar
0x3.0

Bij welke sigma faalt zbarimg? Falen is in dit geval met exit code 4, wat betekent dat er geen barcode is gedetecteerd in één of meer van de afbeeldingen. Er zijn geen andere fouten opgetreden. We stuurden elk van de afbeeldingen naar zbarimg en registreerden de sigma en de exit code:

dany@pindabook:~> for j in $(LC_ALL=C seq 0.1 0.1 3); do zbarimg grayL_"$j".png &>/dev/null; echo "0x$j - $?"; done | column
0x0.1 - 0       0x0.6 - 0       0x1.1 - 4       0x1.6 - 4       0x2.1 - 4       0x2.6 - 4
0x0.2 - 0       0x0.7 - 0       0x1.2 - 4       0x1.7 - 4       0x2.2 - 4       0x2.7 - 4
0x0.3 - 0       0x0.8 - 0       0x1.3 - 4       0x1.8 - 4       0x2.3 - 4       0x2.8 - 4
0x0.4 - 0       0x0.9 - 0       0x1.4 - 4       0x1.9 - 4       0x2.4 - 4       0x2.9 - 4
0x0.5 - 0       0x1.0 - 0       0x1.5 - 4       0x2.0 - 4       0x2.5 - 4       0x3.0 - 4

Dus de sigma-drempel voor detecteerbaarheid in een onscherpe "grayL.png" ligt tussen 1,0 en 1,1:

zbar
0x1.0
Detecteerbaar
zbar
0x1.1
Niet detecteerbaar

Is het foutcorrectieniveau van invloed op de onscherpheidsdrempel? Om dat uit te zoeken hebben we bovenstaande oefening herhaald met de M-, Q- en H-beelden. De drie hogere foutcorrectieniveaus hadden bijna dezelfde iets hogere sigma-drempel:

Level	Size	Threshold
L	147x147	1.0 - 1.1
M	159x159	1.3 - 1.4
Q	183x183	1.3 - 1.4
H	195x195	1.4 - 1.5

En het is indrukwekkend dat zbarimg deze wazige beelden correct kan lezen:

zbar
dany@pindabook:~> zbarimg grayH_1.4.png
Name Error (Connection ":1.176" is not allowed to own the service "org.linuxtv.Zbar" due to security policies in the configuration file)
QR-Code:BEGIN:VCARD
VERSION:4.0
FN:Dany Pinoy
N:Pinoy;Dany;
ORG:Pindanet
TITLE:Oprichter
URL:https://pindanet.be
END:VCARD
...

Opruimen

We hebben heel wat QR code afbeeldingen aangemaakt. Voor we ze definitief verwijderen, controleren we of onze bestandsfilter wel de juiste bestanden zal wissen. Beter voorkomen, dan spijt hebben.

dany@pindabook:~> ls bw*.png gray{L,M,Q,H}*.png

Blijkt uit het weergegeven overzicht dat er geen bestanden worden weergegeven die we nog nodig hebben, kunnen we ze verwijderen met:

dany@pindabook:~> rm bw*.png gray{L,M,Q,H}*.png

De geïnstalleerde software en zijn afhankelijkheden die niet door andere software op jouw systeem wordt gebruikt, verwijder je met de opdracht:

dany@pindabook:~> sudo zypper remove -u zbar qrencode
[sudo] wachtwoord voor root: 
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

De volgende 8 pakketten zullen worden VERWIJDERD:
  libGraphicsMagick3-config libGraphicsMagick-Q16-3 libGraphicsMagickWand-Q16-2 libwmf-0_2-7 libzbar0
  libzbarqt0 qrencode zbar

8 te verwijderen pakketten.
Na de bewerking zal 5,2 MiB worden vrijgemaakt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
(1/8) Verwijderen van qrencode-4.0.0-1.17.x86_64 ...............................................[gereed]
(2/8) Verwijderen van zbar-0.23.1-1.12.x86_64 ..................................................[gereed]
(3/8) Verwijderen van libzbarqt0-0.23.1-1.12.x86_64 ............................................[gereed]
(4/8) Verwijderen van libGraphicsMagickWand-Q16-2-1.3.35-150300.3.3.1.x86_64 ...................[gereed]
(5/8) Verwijderen van libzbar0-0.23.1-1.12.x86_64 ..............................................[gereed]
(6/8) Verwijderen van libGraphicsMagick-Q16-3-1.3.35-150300.3.3.1.x86_64 .......................[gereed]
(7/8) Verwijderen van libwmf-0_2-7-0.2.12-150000.4.4.1.x86_64 ..................................[gereed]
(8/8) Verwijderen van libGraphicsMagick3-config-1.3.35-150300.3.3.1.x86_64 .....................[gereed]