25/02/2023
Har du nogensinde undret dig over, hvordan din smartphone lynhurtigt kan scanne en stregkode i supermarkedet eller en QR-kode fra en plakat? Stregkodescanning er en fundamental funktion i mange moderne applikationer, og teknologien bag udvikler sig konstant for at blive mere effektiv og præcis. For udviklere har Google's ML Kit længe været et foretrukket værktøj til at integrere maskinlæringsfunktioner som stregkodescanning. Men hvad er der sket med den velkendte Barcode Scanning API, som mange kender fra ML Kit for Firebase? Den gode nyhed er, at den ikke er forsvundet, men derimod er blevet forbedret og flyttet til en selvstændig ML Kit SDK, hvilket åbner op for nye muligheder og markante forbedringer i ydeevne og nøjagtighed.

Hvad Skete der med Barcode Scanning API'en?
Oprindeligt var Barcode Scanning API en integreret del af ML Kit for Firebase, en omfattende platform der tilbød en række maskinlæringsfunktioner til mobiludviklere. Denne integration gjorde det nemt at komme i gang med at tilføje avancerede funktioner til apps, der allerede brugte Firebase. Men som med mange teknologier undergår API'er og SDK'er løbende udvikling. I et skridt mod større fleksibilitet og optimering er Barcode Scanning API nu blevet flyttet til den uafhængige ML Kit SDK. Dette betyder, at du nu kan udnytte den kraftfulde stregkodescanningsteknologi, uanset om dit projekt anvender Firebase eller ej. Denne overgang er ikke blot en omrokering; den har også medført betydelige fremskridt i selve scanningsmodellen. Den nye model, introduceret med version 24.0.0 af firebase-ml-vision, byder på markante forbedringer i både ventetid og nøjagtighed. Desuden giver den nyeste API adgang til råbytes af ikke-UTF-8-kodede stregkodedata, hvilket giver udviklere mere kontrol og fleksibilitet. For at drage fordel af disse forbedringer er det afgørende at inkludere det nye firebase-ml-vision-barcode-model modul i dit projekts afhængigheder. Dette sikrer, at din app bruger den optimerede og nyeste model til stregkodedetektering.
Fordele ved den Nye Barcode Scanning API
Den opdaterede Barcode Scanning API, der nu er en del af den selvstændige ML Kit SDK, bringer en række væsentlige fordele, der direkte påvirker ydeevnen og anvendeligheden af stregkodescanning i dine applikationer. Disse forbedringer er resultatet af en kontinuerlig stræben efter at optimere maskinlæringsmodeller for mobilbrug.
Den mest bemærkelsesværdige fordel er den forbedrede latens (ventetid). Dette betyder, at det tager kortere tid for API'en at behandle et billede og identificere stregkoder. I realtidsapplikationer, såsom inventarstyring eller kasseapparater, hvor hurtig scanning er afgørende, er dette en game-changer. Brugerne vil opleve en mere flydende og responsiv oplevelse, da forsinkelser minimeres.
Samtidig er nøjagtigheden af stregkodedetekteringen blevet markant forbedret. Den nye model er bedre til at genkende stregkoder under forskellige forhold, herunder dårlig belysning, let slørede billeder eller delvist beskadigede koder. Dette reducerer fejlraten og behovet for gentagne scanningsforsøg, hvilket fører til en mere pålidelig og frustrerende-fri brugeroplevelse. Forbedret nøjagtighed er især vigtig for forretningskritiske applikationer, hvor fejlscanninger kan have økonomiske konsekvenser.
En anden væsentlig forbedring er muligheden for at få adgang til de råbytes af ikke-UTF-8-kodede stregkodedata. Tidligere var data ofte begrænset til UTF-8-kodning, hvilket kunne være en begrænsning for visse typer stregkoder eller specifikke anvendelsestilfælde. Denne nye funktion giver udviklere fuld kontrol over de rådata, hvilket muliggør mere avanceret databehandling eller understøttelse af proprietære stregkodeformater. Dette åbner op for en bredere vifte af potentielle anvendelsesmuligheder og fleksibilitet i applikationsdesign.
For at udnytte disse fordele skal du sikre dig, at dit projekt er korrekt konfigureret. Udover de sædvanlige ML Kit afhængigheder skal du tilføje implementation 'com.google.firebase:firebase-ml-vision-barcode-model:16.0.1' til din app/build.gradle fil. Dette modul indeholder den nye, optimerede stregkodescanningsmodel, der leverer de nævnte forbedringer. Det er et lille skridt, men med stor betydning for ydeevnen af din stregkodescanningsfunktion.
Krav til Inputbilleder for Optimal Scanning
For at ML Kit's Barcode Scanning API kan fungere med maksimal nøjagtighed og effektivitet, er kvaliteten af inputbilledet afgørende. Selvom den nye model er mere robust, er der stadig retningslinjer, der kan optimere scanningsresultaterne.
Det primære krav er, at inputbillederne skal indeholde stregkoder repræsenteret med tilstrækkelige pixeldata. Dette betyder, at stregkoden skal være stor nok og detaljeret nok i billedet til, at algoritmen kan genkende dens mønster. De specifikke krav til pixeldata afhænger af stregkodens type og mængden af kodede data, da de fleste stregkoder understøtter en variabel længde af indhold.
Generelt skal den minimale meningsfulde enhed i en stregkode – f.eks. bredden af den tyndeste streg eller mellemrummet i en 1D-stregkode, eller størrelsen af en enkelt celle i en 2D-stregkode – have en bredde på mindst 2 pixel. For 2D-koder gælder dette også for højden. Lad os tage et par eksempler:
- EAN-13 stregkoder: Disse koder indeholder streger og mellemrum med bredder på 1, 2, 3 eller 4 enheder. Ideelt set bør en EAN-13 stregkode i billedet have streger og mellemrum med bredder på mindst 2, 4, 6 og 8 pixel. Da en EAN-13 stregkode har en samlet bredde på 95 enheder, bør den ideelt set være mindst 190 pixel bred i billedet.
- PDF417 stregkoder: Dette er et tættere format, der kræver større pixeldimensioner for pålidelig læsning. En PDF417-kode kan indeholde op til 34 'ord' af 17 enheder i bredden på en enkelt række, hvilket ideelt set ville kræve en bredde på 1156 pixel for den række.
Dårlig billedfokus kan også alvorligt påvirke scanningsnøjagtigheden. Hvis du ikke opnår acceptable resultater, er det ofte en god idé at bede brugeren om at tage billedet igen, eventuelt med fokus justeret manuelt eller automatisk.
Hvad angår billedopløsning, anbefales det for typiske applikationer at levere et billede med højere opløsning (f.eks. 1280 x 720 eller 1920 x 1080). Dette gør stregkoder genkendelige på længere afstand fra kameraet, hvilket forbedrer brugervenligheden. Dog, i applikationer hvor latens er afgørende – for eksempel kontinuerlig scanning i et produktionsmiljø – kan du forbedre ydeevnen ved at optage billeder med en lavere opløsning, forudsat at stregkoden udgør hovedparten af inputbilledet. Dette reducerer mængden af data, der skal behandles, og dermed behandlingstiden. Husk altid at balancere billedkvalitet med ydeevnekrav for din specifikke anvendelse.
Konfiguration af Stregkodedetektoren
Før du begynder at scanne, kan du optimere stregkodedetektoren for at forbedre dens hastighed og effektivitet. Hvis du på forhånd ved, hvilke stregkodeformater din app skal læse, kan du konfigurere detektoren til udelukkende at fokusere på disse formater. Dette minimerer den mængde arbejde, detektoren skal udføre, da den ikke behøver at forsøge at identificere alle mulige stregkodeformater.
For at konfigurere detektoren skal du oprette et FirebaseVisionBarcodeDetectorOptions objekt. Her er et eksempel på, hvordan du kan indstille detektoren til kun at genkende QR-koder og Aztec-koder:
FirebaseVisionBarcodeDetectorOptions options = new FirebaseVisionBarcodeDetectorOptions.Builder() .setBarcodeFormats( FirebaseVisionBarcode.FORMAT_QR_CODE, FirebaseVisionBarcode.FORMAT_AZTEC) .build();Dette er en simpel, men effektiv måde at finjustere detektoren på. Hvis du ikke specificerer nogen formater, vil detektoren som standard forsøge at genkende alle understøttede formater, hvilket er mere fleksibelt, men potentielt langsommere.
ML Kit understøtter en bred vifte af populære stregkodeformater. Her er en oversigt over de formater, du kan specificere:
| Format | Beskrivelse |
|---|---|
FORMAT_CODE_128 | Code 128 (lineær stregkode) |
FORMAT_CODE_39 | Code 39 (lineær stregkode) |
FORMAT_CODE_93 | Code 93 (lineær stregkode) |
FORMAT_CODABAR | Codabar (lineær stregkode) |
FORMAT_EAN_13 | European Article Number (EAN-13, lineær stregkode) |
FORMAT_EAN_8 | European Article Number (EAN-8, lineær stregkode) |
FORMAT_ITF | Interleaved 2 of 5 (ITF, lineær stregkode) |
FORMAT_UPC_A | Universal Product Code (UPC-A, lineær stregkode) |
FORMAT_UPC_E | Universal Product Code (UPC-E, lineær stregkode) |
FORMAT_QR_CODE | Quick Response Code (2D matrixkode) |
FORMAT_PDF417 | Portable Data File 417 (2D stacked lineær kode) |
FORMAT_AZTEC | Aztec Code (2D matrixkode) |
FORMAT_DATA_MATRIX | Data Matrix (2D matrixkode) |
Det er vigtigt at bemærke en specifik begrænsning for FORMAT_DATA_MATRIX: For at en Data Matrix-kode kan genkendes, skal den krydse billedets midterpunkt. Som en konsekvens heraf kan kun én Data Matrix-kode genkendes per billede. Denne viden kan hjælpe dig med at designe din applikations brugergrænseflade og scanneflow mere effektivt.
Udførelse af Stregkodedetektion
Når detektoren er konfigureret, er næste skridt at fodre den med billeder, som den kan analysere. Processen involverer at oprette et FirebaseVisionImage objekt fra din billedkilde og derefter passere det til detektoren.
ML Kit er fleksibel og understøtter flere forskellige billedkilder:
Fra media.Image (anbefales til kamera-inputs):
Dette er den mest almindelige metode, når du arbejder med live-kamerafeeds eller tager billeder direkte fra enhedens kamera. Du skal overføre både
media.Imageobjektet og billedets rotation tilFirebaseVisionImage.fromMediaImage(). Hvis du bruger CameraX-biblioteket, beregnerOnImageCapturedListenerogImageAnalysis.Analyzerrotationsværdien for dig, hvilket forenkler processen. Rotationen er afgørende for at sikre, at ML Kit tolker billedet korrekt, uanset enhedens orientering.Fra fil-URI:
Hvis du vil scanne stregkoder fra billeder, der er gemt på enheden, f.eks. fra brugerens galleri, kan du bruge
FirebaseVisionImage.fromFilePath(). Dette er især nyttigt, når du bruger enACTION_GET_CONTENTintent til at lade brugeren vælge et billede. Du skal blot angive appens kontekst og fil-URI'en.Fra ByteBuffer eller byte-array:
For mere avancerede scenarier, hvor billeddata er tilgængelige som rå bytes i en
ByteBuffereller et byte-array, skal du først beregne billedets rotation (på samme måde som medmedia.Image). Derefter opretter du etFirebaseVisionImageMetadataobjekt, der indeholder billedets højde, bredde, farvekodningsformat og rotation. Med disse metadata kan du opretteFirebaseVisionImageobjektet.Fra Bitmap:
Hvis du allerede har et
Bitmapobjekt, er processen ligetil. Du kan oprette etFirebaseVisionImageobjekt direkte fraBitmap'en ved hjælp afFirebaseVisionImage.fromBitmap(). Det er vigtigt at sikre, atBitmap'en er i oprejst position og ikke kræver yderligere rotation for korrekt genkendelse.
Når du har dit FirebaseVisionImage objekt klar, skal du hente en instans af FirebaseVisionBarcodeDetector. Dette gøres ved at kalde FirebaseVision.getInstance().getVisionBarcodeDetector(). Hvis du tidligere har konfigureret specifikke stregkodeformater, skal du overføre dine options til denne metode: FirebaseVision.getInstance().getVisionBarcodeDetector(options).
Det sidste skridt er at overføre dit billedobjekt til detektorens detectInImage metode. Denne metode returnerer en asynkron Task, som du kan tilføje succes- og fejllyttere til for at håndtere resultatet af scanningen:
Task<List<FirebaseVisionBarcode>> result = detector.detectInImage(image) .addOnSuccessListener(new OnSuccessListener<List<FirebaseVisionBarcode>>>() { @Override public void onSuccess(List<FirebaseVisionBarcode> barcodes) { // Behandling af fundne stregkoder } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Håndtering af fejl } });Dette asynkrone design sikrer, at din applikation forbliver responsiv, mens stregkodedetektionen udføres i baggrunden.
Hentning af Stregkodeinformation
Når stregkodedetektionsoperationen er fuldført med succes, vil en liste af FirebaseVisionBarcode objekter blive sendt til din succes-lytter. Hvert af disse objekter repræsenterer en stregkode, der blev identificeret i inputbilledet. Fra hvert FirebaseVisionBarcode objekt kan du udtrække en værdifuld mængde information, der giver dig detaljer om den fundne stregkode.
De grundlæggende oplysninger, du kan hente for hver stregkode, inkluderer:
boundingBox: Dette er etRectobjekt, der repræsenterer de koordinater, hvor stregkoden er placeret i inputbilledet. Dette er nyttigt for at tegne en visuel ramme omkring den fundne stregkode i din applikation.cornerPoints: En række afPointobjekter, der angiver hjørnerne af stregkoden i billedet. Dette kan være mere præcist endboundingBoxfor ikke-rektangulære eller skæve stregkoder.rawValue: Dette er de rå, ubehandlede data, der er kodet i stregkoden. Det er en streng, der indeholder den information, stregkoden er designet til at bære, før den fortolkes.
Ud over de rå data kan ML Kit's stregkodedetektor også forsøge at bestemme typen af data, der er kodet i stregkoden, og give dig en parset version af disse data. Dette er utroligt nyttigt, da det fjerner byrden fra udvikleren for at skulle parse almindelige stregkodeformater manuelt. Du kan få adgang til den parset datatype via valueType og derefter caste til det relevante underobjekt.
Her er eksempler på nogle almindelige datatyper, ML Kit kan parse:
TYPE_WIFI: Hvis stregkoden indeholder Wi-Fi-netværksoplysninger (SSID, adgangskode, krypteringstype), kan du få adgang til disse viabarcode.getWifi(). Dette er ideelt til hurtig opsætning af Wi-Fi-forbindelser.TYPE_URL: For stregkoder, der koder en URL, kan du hente både titlen (hvis tilgængelig) og selve URL'en viabarcode.getUrl(). Dette er ofte brugt i QR-koder.
Andre understøttede datatyper inkluderer, men er ikke begrænset til, e-mail-adresser (TYPE_EMAIL), telefonnumre (TYPE_PHONE), kontaktinformation (TYPE_CONTACT_INFO), kalenderbegivenheder (TYPE_CALENDAR_EVENT), geolokationer (TYPE_GEO), og SMS-beskeder (TYPE_SMS). Den fulde liste kan findes i API-referencen for FirebaseVisionBarcode.
Ved at bruge disse parset data kan din applikation automatisk udføre handlinger baseret på stregkodens indhold – f.eks. oprette en kalenderbegivenhed, åbne en hjemmeside, sende en besked eller oprette forbindelse til et Wi-Fi-netværk – hvilket forbedrer brugervenligheden markant.
Tips til Forbedret Ydeevne i Realtid
For applikationer, der kræver kontinuerlig stregkodescanning i realtid, f.eks. i et detailmiljø, lagerstyring eller adgangskontrolsystemer, er ydeevne – især billedhastighed (frames per second, FPS) – afgørende for en glat og effektiv brugeroplevelse. Her er nogle retningslinjer, der kan hjælpe dig med at opnå den bedst mulige ydeevne:
Optimer Billedopløsning:
Selvom højere opløsninger generelt giver bedre nøjagtighed på afstand, kan de også øge behandlingstiden. For realtidsapplikationer, hvor stregkoden forventes at fylde en væsentlig del af kameraets synsfelt, kan du opnå markant bedre ydeevne ved at fange billeder med en lavere opløsning. Overvej at bruge en opløsning, der lige akkurat er tilstrækkelig til at opfylde de minimale pixelkrav for stregkoden (som beskrevet i afsnittet om inputbilleder). Dette reducerer mængden af pixeldata, der skal behandles per frame, og dermed den samlede latens.
Begræns Antal Stregkodeformater:
Som diskuteret i afsnittet om konfiguration, hvis du ved, hvilke stregkodeformater du forventer at scanne (f.eks. kun QR-koder og EAN-13), skal du eksplicit indstille detektoren til kun at søge efter disse formater. Dette reducerer den beregningsmæssige byrde betydeligt, da detektoren ikke spilder tid på at analysere for irrelevante stregkodetyper.
Håndter Kameraets Livscyklus Korrekt:
Sørg for, at kameraet initieres og frigives korrekt. En forkert håndtering af kameraressourcer kan føre til hukommelseslækager, unødvendigt strømforbrug og dårlig ydeevne. Brug Android's CameraX-bibliotek eller tilsvarende, da de er designet til at strømline kamera-integration og ressourcehåndtering.
Asynkron Behandling:
Stregkodedetektion er en ressourcekrævende opgave. Sørg for, at du udfører detektionen på en baggrundstråd (f.eks. ved hjælp af Kotlin Coroutines, Java's
AsyncTaskeller ML Kit's indbyggedeTaskAPI'er), og at du ikke blokerer UI-tråden. Dette forhindrer "Application Not Responding" (ANR) fejl og sikrer, at brugergrænsefladen forbliver flydende og responsiv.Throttling af Billeder:
I et live-kamerafeed kan du modtage mange billeder per sekund. Det er sjældent nødvendigt at behandle hvert enkelt billede. Overvej at implementere en "throttling" mekanisme, der kun sender et billede til detektoren hvert X millisekunder, eller kun når den forrige detektion er fuldført. Dette kan reducere CPU-belastningen markant, især hvis detektionen tager længere tid end billedhastigheden.
Minimer Unødvendig Billedbehandling:
Før du sender billedet til ML Kit, undgå unødvendige billedtransformationer (f.eks. rotation, skalering eller beskæring), medmindre de er absolut nødvendige for korrekt detektion. Hver ekstra billedbehandlingsoperation tilføjer latens.
Test på Forskellige Enheder:
Ydeevnen kan variere betydeligt mellem forskellige Android-enheder på grund af forskelle i processorkraft og hukommelse. Test din applikation på en række forskellige enheder for at identificere potentielle flaskehalse og optimere derefter.
Ved at følge disse retningslinjer kan du sikre, at din stregkodescanningsfunktion ikke kun er nøjagtig, men også hurtig og responsiv, hvilket giver en fremragende brugeroplevelse i realtidsapplikationer.
Ofte Stillede Spørgsmål (FAQ)
- Hvorfor er Barcode Scanning API flyttet fra Firebase til en selvstændig ML Kit SDK?
- Flytningen er et led i Googles strategi for at gøre ML Kit mere fleksibel og uafhængig af Firebase for projekter, der ikke nødvendigvis bruger Firebase. Det har også muliggjort betydelige ydeevneforbedringer og nye funktioner i den separate SDK.
- Hvilke forbedringer er der i den nye stregkodescanningsmodel?
- Den nye model, introduceret med version 24.0.0, byder på markante forbedringer i både ventetid (latens) og nøjagtighed. Desuden giver den adgang til råbytes af ikke-UTF-8-kodede stregkodedata.
- Skal jeg stadig bruge Firebase, hvis jeg vil bruge ML Kit til stregkodescanning?
- Nej, den Barcode Scanning API er nu en del af den selvstændige ML Kit SDK, hvilket betyder, at du kan bruge den med eller uden Firebase i dit Android-projekt.
- Hvilken billedopløsning anbefales for stregkodescanning?
- For generel brug anbefales højere opløsninger som 1280x720 eller 1920x1080 for at genkende stregkoder på større afstand. For latenskritiske realtidsapplikationer kan lavere opløsninger være bedre, hvis stregkoden fylder det meste af billedet.
- Kan jeg begrænse detektoren til kun at scanne specifikke stregkodeformater?
- Ja, du kan konfigurere
FirebaseVisionBarcodeDetectorOptionstil kun at detektere specifikke formater (f.eks. QR-kode og Aztec), hvilket kan øge scanningshastigheden markant. - Hvad er den vigtigste faktor for nøjagtig stregkodescanning?
- Den vigtigste faktor er kvaliteten af inputbilledet. Stregkoden skal have tilstrækkelige pixeldata (mindst 2 pixels pr. minimal enhed) og være i fokus. Dårlig billedkvalitet kan føre til fejl eller manglende detektion.
Hvis du vil læse andre artikler, der ligner Stregkodescanning med ML Kit: En Ny Æra, kan du besøge kategorien Teknologi.
