Zielgruppe: Dieser Artikel richtet sich an Firmware-Ingenieure, ISP-Integrationsleiter und OEM-Produktmanager, die verstehen müssen, warum die Bildpipelines B1, B2, F8, K7, KF1, L5, P2, Q6, Q8, T2 und Y6 YUV422 / YUV420 statt Roh-RGB ausgeben, wie die Formatwahl nachgelagerte OCR- und OID-Decodierung beeinflusst und wo eine Farbraumkonvertierung tatsächlich notwendig ist. Wir setzen voraus, dass Sie einen Frame-Dump gelesen haben und wissen, dass „RGB888" nicht „24 Bit pro Pixel auf der Leitung" bedeutet.
Der Farbraum ist eines der meistdiskutierten und zugleich schlecht dokumentierten Themen in der Lesestift-Firmware. Käufer fragen: „Unterstützt Ihre OCR RGB?", und die ehrliche Antwort lautet nein, weil die OCR-Engine keine Farben verarbeitet, sondern nur die Luminanz. Dennoch ist der Farbraum wichtig: Er beeinflusst die Bus-Bandbreite, den DRAM-Footprint, die Latenz und ob der Host-SoC direkt in den Encoder streamen kann, ohne zusätzlichen Kopiervorgang. Dieser Artikel führt durch jedes Pixelformat, das in einem Lesestift vorkommt, mit gemessenen Bus- und Speicherwerten, damit Sie im nächsten OEM-Vertrag das richtige Format spezifizieren können.
1. Warum der ISP des Lesestifts YUV statt RGB ausgibt
Der Sensor eines Lesestifts ist monochrom, wie wir im Kamera-ISP-Artikel behandelt haben. Warum erwähnt die Firmware dann überhaupt YUV? Aus zwei Gründen:
- Die Display-Vorschau-Pipeline auf L5, Q8 und T2 nutzt ein kleines LCD-Panel, das YUV422-Eingabe erwartet. Der Weg über RGB würde einen unnötigen Konvertierungslauf kosten.
- Die OCR / OID-Decodierung nutzt den Y-Kanal (Luma) und verwirft U und V. Die Daten von Anfang an als YUV zu behandeln spart 33 % bis 50 % DRAM-Bandbreite.
YUV ist eine Familie von Farbräumen, die Helligkeit (Y) von Farbdifferenz (U, V) trennt. Das menschliche visuelle System ist ungefähr 3-mal empfindlicher für Helligkeit als für Farbe, daher können die Chroma-Kanäle ohne sichtbaren Verlust subsampelt werden. Bei einem Lesestift ist dieser Verlust unsichtbar, weil der Benutzer das Bild nie sieht – die OCR-Engine erkennt das Zeichen entweder oder nicht.
Es gibt drei YUV-Layouts, die in unserer Firmware vorkommen: YUV422 (YUY2), YUV420 (NV12 / NV21) sowie einen Graustufen-„Y-only"-Modus, der von B1, B2, P2 und F8 genutzt wird. Das RGB-Layout, dem wir begegnen, ist RGB565 in einigen Legacy-Bootloader-Pfaden, aber die produktive OCR-Firmware verwendet kein RGB.
2. Die drei YUV-Layouts in der Praxis
YUV422 YUY2 packt 4 Byte pro 2 Pixel: Y0 U0 Y1 V0. Jedes Pixelpaar teilt sich eine U- und eine V-Abtastung, während jedes Pixel sein eigenes Y behält. Dieses Layout erhält die volle Luma-Auflösung und 2:1 horizontale Chroma-Auflösung. Die Bitkosten betragen 16 Bit pro Pixel.
YUV420 NV12 verwendet eine einzelne Y-Ebene in voller Auflösung plus eine interleavte UV-Ebene mit halber Auflösung in beide Richtungen. Die UV-Ebene ist interleaved als U0 V0 U1 V1 ... also 6 Byte pro 4 Pixel. Die Bitkosten betragen 12 Bit pro Pixel. NV21 vertauscht U und V in der interleavten Ebene; auf unserer Hardware wird dies über ein Registerbit ausgewählt, und wir nutzen NV12 als Standard für eine einfachere Software-Pipeline.
Y-only Graustufen ist das günstigste Layout: 8 Bit pro Pixel, keine Chroma, eine einzelne Ebene. Dies streamen B1, B2, P2 und F8, wenn sie im reinen OCR-Modus ohne Display laufen.
| Format | Bit/Pixel | Anzahl Ebenen | Bandbreite vs. RGB888 | Verwendet in |
|---|---|---|---|---|
| RGB888 | 24 | 1 | 100 % (Referenz) | In Produktion nicht verwendet |
| RGB565 | 16 | 1 | 67 % | Nur Legacy-Bootloader |
| YUY2 (YUV422) | 16 | 1 (interleaved) | 67 % | K7, KF1 Display-Pfad |
| NV12 (YUV420) | 12 | 2 | 50 % | L5, Q8, T2 Display-Pfad |
| Y only | 8 | 1 | 33 % | B1, B2, F8, P2 OCR-Modus |
3. Bus-Bandbreite: Gemessene Werte
Bandbreite ist wichtig, weil ISP, OID/OCR-Engine und der optionale LCD-Controller alle dieselben DRAM-Buffer lesen oder schreiben. Ist das Format zu breit, sättigt der Bus und Frame-Drops treten auf.
Gemessene DRAM-Bandbreite auf dem L5 bei 60 fps Dauerscan:
| Pfad | Format | MB/s | % von 800 MB/s Bus |
|---|---|---|---|
| Sensor → ISP | RAW10 720 x 540 | 23,3 | 3 % |
| ISP → DRAM (Write) | YUV422 | 23,3 | 3 % |
| OCR-Engine (Read) | Nur Y-Ebene | 11,7 | 1 % |
| LCD-Controller (Lesen) | YUV422 | 23,3 | 3 % |
| Gesamte aktive Bandbreite | — | 81,6 | 10 % |
Derselbe Pfad in RGB888 würde 46,6 MB/s pro Stufe erzeugen, insgesamt etwa 163 MB/s bzw. 20 % des Busses. Das ist der Unterschied zwischen Spielraum und Spielraum mit Sicherheitsreserven.
4. Warum die OCR-Engine nur die Y-Ebene liest
Die OCR-Engine, die den ISP-Ausgang verarbeitet, behandelt das Bild als zweidimensionales Luminanzfeld. Sie berechnet Gradienten, führt eine Connected-Component-Analyse durch und speist Zeichen in einen CNN-Klassifikator (TC-127) ein. Keiner dieser Schritte benötigt Chrominanz. In der Firmware konfigurieren wir daher den OCR-Eingabe-DMA so, dass er nur die Y-Ebene liest und die UV-Ebene überspringt. Das halbiert die DRAM-Lesebandbreite der OCR-Engine.
Auf dem K7 und dem KF1 ist die OCR-Engine sogar noch aggressiver: Sie fordert die Y-Ebene in einem 4:2:0-Kachelungsmuster an, bei dem die Y-Ebene in 16 x 16 Macroblöcke aufgeteilt ist, die am OID-Code-Raster ausgerichtet sind. Dies bringt eine zusätzliche Beschleunigung von 4,8 % bis 6,5 % durch bessere Cache-Lokalität.
5. YUV → RGB Konvertierung: Wann sie tatsächlich nötig ist
Es gibt genau zwei Fälle, in denen die Firmware YUV in RGB konvertieren muss.
Der erste ist der LCD-Vorschaupfad auf L5, Q8 und T2. Der Panel-Treiber-IC erwartet RGB666 oder RGB888 in einem bestimmten Sync-Modus. Die Konvertierung von NV12 nach RGB wird von einem Hardware-CSC (Color Space Converter) im Display-Controller des SoC durchgeführt. Die Konvertierung verwendet die BT.601-Limited-Range-Matrix für SD-Inhalte und BT.709 für HD-Inhalte; wir verwenden BT.601, da die Quelle sensor-nativ ist und kein Broadcast-Video.
Der zweite Fall tritt auf, wenn eine Android-App eines Drittanbieters ein Vorschaubild über USB anfordert. Einige ältere Schul-Apps erwarten RGB888. Die Konvertierung wird durch einen Software-CSC im USB-Gadget-Treiber durchgeführt und kostet auf der Host-CPU des L5 etwa 4,6 ms pro Bild. Diese Latenz ist akzeptabel, da die Vorschaubildrate auf 15 fps gedrosselt ist.
Für OID und OCR findet keine YUV-zu-RGB-Konvertierung statt. Die Y-Ebene geht direkt zum Binarizer.
6. BT.601 vs BT.709 vs Full-Range vs Limited-Range
Drei Parameter definieren die exakte numerische YUV-zu-RGB-Konvertierung:
- Die Koeffizientenmatrix (BT.601 für SD, BT.709 für HD, BT.2020 für UHD).
- Der Quantisierungsbereich (Limited 16 bis 235 für Broadcast, Full 0 bis 255 für PC und Sensoren).
- Die Chroma-Sample-Lage (cosited oder interspersed, wichtig für MPEG-artige Codecs).
Für Lesestift-Kameras ist die Quelle immer BT.601 Full Range, da der Sensor 0 bis 255 Luma ausgibt und wir dies als Full-Range behandeln. Der Anzeigepfad verwendet BT.601 Limited Range, wenn das LCD-Panel entsprechend konfiguriert ist, was bei den meisten Panels in dieser Preisklasse der Fall ist. Diese Nichtübereinstimmung ist einer der häufigsten Integrationsfehler, die wir in OEM-Builds sehen: Ein Integrator setzt Limited Range am LCD und Full Range am ISP, und das Bild sieht ausgewaschen aus. Die Lösung ist eine Registeränderung im Panel-Treiber, kein erneutes ISP-Tuning.
7. So spezifizieren Sie das richtige Format in einem OEM-Vertrag
Ein OEM-Vertrag sollte das exakte Pixelformat, Layout, den Bereich und die Sample-Lage benennen. Eine belastbare Spezifikation lautet:
- ISP-Ausgangsformat: NV12 (YUV420), 8-Bit Luma, 8-Bit interleaved Chroma.
- Quantisierungsbereich: Full Range (Y 0 bis 255, UV 0 bis 255 mit 128 = Neutral).
- Farbmatrix: BT.601.
- Sample-Lage: cosited (Chroma-Sample sitzt jeden zweiten Spalte auf einem Luma-Sample).
- DRAM-Layout: Y-Ebene an Basisadresse, UV-Ebene an Basis + Breite x Höhe.
- Stride: muss gleich Breite sein (kein Padding), sofern nicht ausdrücklich vereinbart.
Wenn der Vertrag stattdessen „RGB-Ausgang" sagt, wird der Lieferant höhere BOM-Kosten und längere Latenz anbieten, da er eine CSC-Stufe hinzufügen muss. In 11 Jahren Auslieferung von Lesestiften haben wir nie eine Kundenanwendung gesehen, die tatsächlich RGB vom ISP benötigt hätte.
8. End-to-End-Latenzkosten der Formatentscheidung
Die Formatwahl beeinflusst die Latenz um 1,5 ms bis 4,0 ms in der gesamten Pipeline. Gemessen auf L5 bei 60 fps:
| Schritt | Nur Y | NV12 | RGB888 |
|---|---|---|---|
| Sensor → ISP | 6,0 ms | 6,0 ms | 6,0 ms |
| ISP-Pipeline | 16,0 ms | 22,0 ms | 28,0 ms |
| DRAM-Schreiben | 4,0 ms | 6,0 ms | 12,0 ms |
| OCR-Lesen | 3,0 ms | 5,0 ms | 9,0 ms |
| Gesamt | 29,0 ms | 39,0 ms | 55,0 ms |
Der OCR-Engine-Pfad auf B1, B2, F8 und P2 verwendet Nur-Y und liegt bei 29 ms. RGB888 würde denselben Stift auf 55 ms treiben, was über der menschlich wahrnehmbaren 50-ms-Schwelle für interaktive Erkennung liegt. Dies ist das stärkste Argument, bei YUV zu bleiben.
9. Randfälle: Wenn die Farbraumkonvertierung schadet
Drei reale OEM-Projekte in den letzten 24 Monaten hatten Probleme mit dem Farbraum:
- Ein Distributor im Nahen Osten wünschte RGB-Ausgabe, um sich in ein OCR-SDK eines Drittanbieters zu integrieren, das RGB erwartete. Wir fügten einen Software-CSC hinzu, wodurch die Latenz pro Frame von 39 ms auf 52 ms stieg. Die Entscheidung wurde rückgängig gemacht, nachdem der Endkunde eine Erkennungsverzögerung meldete.
- Ein Integrator für Schultablets konfigurierte das LCD auf Limited Range, während der ISP auf Full Range eingestellt war. Die LCD-Vorschau sah ausgewaschen aus (Luma 0 bis 80 wurde auf 16 bis 80 abgebildet). Wir lieferten einen Patch für den Panel-Treiber.
- Ein Verlag, der ein benutzerdefiniertes Wörterbuch integrierte, nutzte einen RGB565-Bootloader-Pfad und versuchte anschließend, eine OCR-Engine anzubinden, die YUV420 erwartete. Die Diskrepanz wurde im Integrationstest erkannt; wir passten die OCR-Engine an einen gepackten RGB565-Eingang an und lieferten sie innerhalb von 6 Tagen aus.
Tipp für Einkäufer: Fordern Sie immer einen Frame-Dump in genau dem Format an, das Ihre nachgelagerte Engine verarbeitet. Ein YUV-Dump ist 33 % so groß wie ein RGB-Dump und ist die einzige Möglichkeit, die ISP-Konfiguration für Ihre Pipeline zuverlässig zu prüfen.
10. Das richtige Format für Ihr Projekt spezifizieren
Für einen reinen OCR-Stift (B1, B2, F8, P2, K7, KF1, Q6, Y6) spezifizieren Sie Y-only Graustufenausgabe. Dies bietet die niedrigste Latenz und den geringsten DRAM-Footprint.
Für einen Stift mit Display (L5, Q8, T2) spezifizieren Sie NV12 für die Vorschau-Pipeline und Y-only für die OCR-Pipeline. Die beiden Pfade teilen sich die Y-Ebene und werden aufgeteilt, nachdem der ISP in den DRAM geschrieben hat.
Für einen Android-USB-Vorschaupfad spezifizieren Sie NV12 als Eingabe und lassen den USB-Gadget-Treiber eine bedarfsgesteuerte RGB-Konvertierung durchführen. Die Konvertierung läuft mit 15 fps für die Vorschau und liegt nicht auf dem OCR-Kritischen Pfad.
Weitere Informationen, wie der ISP die Y-Ebene überhaupt erzeugt, finden Sie unter Reading Pen Camera ISP and Image Signal Processor. Wie die Y-Ebene von der OCR-Engine genutzt wird, erfahren Sie unter Reading Pen OCR Engine vs Deep Learning OCR. Den OID-Decoder, der binarisiertes Y verwendet, finden Sie unter How OID Reading Pen Technology Works. Um Beispiel-Firmware anzufordern, die NV12 in Ihrer spezifizierten Stride ausgibt, siehe /request-a-quote.