Dieser Artikel bewahrt den vollständigen technischen Haupttext (PDF S. 9–47) der 47-seitigen englischen Quelle V1.0.34. Eine entsprechende chinesische PDF-Datei wurde nicht bereitgestellt. Die chinesische und russische Fassung übersetzen die englische Quelle vollständig; die drei bisherigen Artikel verwenden Originalabbildungen aus der englischen PDF-Datei, einschließlich darin bereits vorhandener chinesischer Beschriftungen. Auch diese deutsche Fassung übernimmt dieselben Originalabbildungen und übersetzt den vollständigen englischen Artikel. Code, Parameter, Bezeichner, Beispielwerte und Codekommentare bleiben im Quelltext erhalten; Fließtext und Bildunterschriften werden lokalisiert.
Die Chipsätze im Geltungsbereich der Quelle sind unten aufgeführt. Die Quelle nennt weder eine einheitliche Kernelversion noch bestimmte ArmSoM-Platinen. Dies ist eine ArmSoM-Plattformreferenz: Prüfen Sie den tatsächlichen SoC, das Modul, den Sensor, VCM/OIS, ISP, SDK/BSP, die Version der Kalibrierungs-DLL/API, die Treiber und das OTP-/EEPROM-Layout. Die Modulbeispiele der Quelle sind keine ArmSoM-Testergebnisse. Es wurden keine Hardwarevalidierung, Kalibrierung, Programmierung oder Kameraoperationen durchgeführt.
Betriebsrisiko und Quellenhinweise: OTP-/EEPROM-Programmierung kann irreversibel sein oder die Modulkalibrierung überschreiben. Prüfen Sie zuerst den Herstellerablauf und das Speicherlayout des Zielgeräts. Mehrere Standardwerte, Funktionsdeklarationen und Aufrufe im Anhang unterscheiden sich in der Quelle. Der Anhang ist ein Quellenbeispiel, keine Garantie für Kompilierbarkeit oder Produktionstauglichkeit. Formeln, Adressen, Bitbreiten und IDs behalten die Quellwerte bei; technische Konstanten wurden nicht stillschweigend korrigiert.
| Chipsätze im Geltungsbereich der Quelle |
|---|
| RV1109 / RV1126 / RK356X / RK3588 |
Quellenhinweise und Prüfprotokoll: EDITORIAL-NOTES. ArmSoM · Rockchip Linux
1 LSC- und AWB-Kalibrierungsablauf
1.1 Kalibrierungsverfahren
1. Lichtumgebung und Ausrüstung
D50 (5000K±100K), unter Vermeidung von Störlicht aus der Umgebung.
Ein Homogenisator oder eine DNP-Lichtbox, die der obigen Lichtquelle entspricht. Der Homogenisator ist in der folgenden Abbildung dargestellt:

Technische Abbildung aus der englischen Quelle, PDF S. 9.
2. Aufnahmeverfahren
1. Wählen Sie je nach den tatsächlichen Gegebenheiten eines der folgenden beiden Verfahren:
- Mit Homogenisator: Platzieren Sie dessen beschichtete Seite nahe vor dem Objektiv und zum Objektiv hin ausgerichtet; halten Sie die Stirnfläche des Moduls, den Homogenisator und die Lichtquellenfläche parallel.
- Mit DNP-Lichtbox: Platzieren Sie das Modul 1-2cm vor der DNP-Lichtquellenfläche und halten Sie die Stirnfläche des Moduls parallel zu dieser Fläche.
- Deaktivieren Sie Funktionen wie mirror/flip.
- Wählen Sie die Belichtung so, dass die maximale Helligkeit (8bit) des G-Kanals im Bild zwischen 160~180 liegt.
- Nehmen Sie mit dieser Belichtung ein RAW-Bild auf und speichern Sie es.
3. AWB-Kalibrierung
1. Wählen Sie den mittleren Bereich des RAW-Bildes (20% der Länge und Breite jedes Kanals) und berechnen Sie die Mittelwerte der Kanäle R, Gr, Gb und B.
Gr_ave=Gr-Mittelwert der ROI - Schwarzpegel
Gb_ave=Gb-Mittelwert der ROI - Schwarzpegel
R_ave = Rot-Mittelwert der ROI - Schwarzpegel
B_ave = Blau-Mittelwert der ROI - Schwarzpegel
2. Berechnen Sie R/Gb, B/Gb und Gr/Gb.
R/Gb=R_ave/Gb_ave
B/Gb=B_ave/Gb_ave
Gr/Gb=Gr_ave/Gb_ave
3. Stellen Sie R/Gb, B/Gb und Gr/Gb als Festkommawerte mit 10 Bits dar: R/Gb_hex=R/Gb * 1024
B/Gb_hex=B/Gb * 1024
Gr/Gb_hex=Gr/Gb * 1024
4. LSC-Kalibrierung
1. Setzen Sie den Zielwert für die Kalibrierungsberechnung auf 70%.
2. Berechnen Sie die Verstärkung jedes der vier Kanäle mit 10 Bits.
1.2 Prüfkriterien
1. Vor der LSC-Kalibrierung
1. Y-Shading-Kriterium:
ROI = 1/5 Width * 1/5Height
YShading_Corner = Y_Corner/Y_Center
30% < YShading_Corner < 55%
Ydiffer = YShading_Corner_Max - YShading_Corner_Min < 7%
2. Color-Shading-Kriterium:
Gleichmäßigkeit der Farbschattierung eines einzelnen Moduls: Begrenzen Sie den Unterschied zwischen jedem Block und dem mittleren Block des Moduls.
ROI-Raster: 1/5*1/5. Berechnen Sie den Unterschied zwischen den 24 Blöcken und dem mittleren Block.
ROI = 1/5Width * 1/5Height
|(R/G_Corner)/(R/G_Center)-1| < 15%
|(B/G_Corner)/(B/G_Center)-1| < 15%
2. LSC-Kalibrierung
Für das Problem einer asymmetrischen Randabschattung in den aufgenommenen RAW-Daten aufgrund der Modulpositionierung wurde der Schnittstelle lsc_otp_Calibrate der Parameter ratio zur Begrenzung des Kalibrierungsergebnisses hinzugefügt (Standard: ratio=1.5).
Verschiebt sich das optische Zentrum aufgrund der Modulmontage selbst, kann ratio erhöht werden, um die Bestehensquote zu verbessern.
3. Nach der LSC-Kalibrierung
1. Y-Shading-Kriterium:
ROI = 1/5 Width * 1/5Height
YShading_Corner = Y_Corner/Y_Center
Ydiffer = YShading_Corner_Max - YShading_Corner_Min < 5%
2. Color-Shading-Kriterium:
Gleichmäßigkeit der Farbschattierung eines einzelnen Moduls: Begrenzen Sie den Unterschied zwischen jedem Block und dem mittleren Block des Moduls.
ROI-Raster: 1/5*1/5. Berechnen Sie den Unterschied zwischen den 24 Blöcken und dem mittleren Block.
ROI = 1/5Width * 1/5Height
|(R/G_Corner)/(R/G_Center)-1| < 5%
|(B/G_Corner)/(B/G_Center)-1| < 5%
2 PDAF-Kalibrierungsablauf
Die PDAF-Kalibrierung besteht aus zwei Teilen: Gain-Map-Kalibrierung und DCC-Map-Kalibrierung. Der Ablauf lautet:

Technische Abbildung aus der englischen Quelle, PDF S. 12.
2.1 Vorbereitung der Kalibrierung
1. Modulvorbereitung
(1) Prüfung auf Objektivverschmutzung
(2) VCM-Prüfung: Linearität, Genauigkeit und Stabilität der Linsenposition testen
(3) AF-Grundkorrektur:
Ermitteln Sie die Beziehung zwischen DAC und Fokusabstand: Kalibrieren Sie die Motorposition des Modulobjektivs bei Inf und Marco, zeichnen Sie die zugehörigen Werte DAC_inf und Dac_marco auf und bestimmen Sie DCC_LENS_BEGIN und DCC_LENS_END. Der Objektabstand, bei dem die Schärfe bei mittlerer Motorposition am größten ist, ist der DCC-Map-Kalibrierabstand a.
Die mittlere Motorposition ist DAC = (DAC_INF + DAC_MACRO)/2. Der entsprechende Kalibrierabstand a lässt sich aus der Schärfentiefentabelle des Objektivs bestimmen. Ermitteln Sie zuerst die Linsenverschiebungen für INF und MACRO, berechnen Sie die Mitte zwischen beiden und suchen Sie in der Tabelle die dieser Mitte nächstgelegene Linsenverschiebung. Daraus ergeben sich die mittlere Motorposition und der zugehörige Objektabstand A. Beispiel: Bei unendlichem Objektabstand beträgt die Linsenverschiebung 0. Als kürzester Objektabstand werden 10cm gewählt, mit einer Linsenverschiebung von -0.183. Die Linsenverschiebung in der mittleren Motorposition beträgt dann -0.0915. Der nächstgelegene Tabellenwert ist -0.091; der entsprechende DCC-Map-Kalibrierabstand a beträgt 0.20 Meter.
| Objektabstand (m) | Linsenverschiebung (mm) | Ferngrenze (m) | Nahgrenze (m) |
|---|---|---|---|
| INF | 0.000 | - | - |
| 10.0 | -0.002 | INF | 4.33 |
| 7.6 | -0.002 | 14417.449 | 3.81 |
| 5.0 | -0.004 | 14.511 | 3.02 |
| 4.0 | -0.004 | 8.406 | 2.63 |
| 3.0 | -0.006 | 4.941 | 2.15 |
| 2.0 | -0.009 | 2.71 | 1.59 |
| 1.9 | -0.009 | 2.53 | 1.52 |
| 1.8 | -0.010 | 2.35 | 1.46 |
| 1.7 | -0.010 | 2.19 | 1.39 |
| 1.6 | -0.011 | 2.02 | 1.32 |
| 1.5 | -0.012 | 1.87 | 1.25 |
| 1.4 | -0.013 | 1.71 | 1.18 |
| 1.3 | -0.014 | 1.57 | 1.11 |
| 1.2 | -0.015 | 1.42 | 1.04 |
| 1.1 | -0.016 | 1.28 | 0.96 |
| 1.0 | -0.018 | 1.15 | 0.88 |
| 0.9 | -0.020 | 1.02 | 0.81 |
| 0.8 | -0.022 | 0.89 | 0.72 |
| 0.7 | -0.025 | 0.77 | 0.64 |
| 0.6 | -0.029 | 0.65 | 0.56 |
| 0.5 | -0.035 | 0.53 | 0.47 |
| 0.45 | -0.039 | 0.478 | 0.425 |
| 0.40 | -0.044 | 0.422 | 0.380 |
| 0.35 | -0.051 | 0.366 | 0.335 |
| 0.30 | -0.059 | 0.312 | 0.289 |
| 0.25 | -0.071 | 0.258 | 0.242 |
| 0.20 | -0.091 | 0.202 | 0.192 |
| 0.15 | -0.120 | 0.153 | 0.147 |
| 0.14 | -0.129 | 0.142 | 0.138 |
| 0.13 | -0.140 | 0.132 | 0.128 |
| 0.12 | -0.152 | 0.122 | 0.118 |
| 0.11 | -0.166 | 0.111 | 0.109 |
| 0.10 | -0.183 | 0.101 | 0.099 |
| 0.09 | -0.205 | 0.091 | 0.089 |
| 0.08 | -0.232 | 0.081 | 0.079 |
| 0.07 | -0.267 | 0.071 | 0.069 |
| 0.06 | -0.315 | 0.060 | 0.060 |
| 0.05 | -0.383 | 0.050 | 0.050 |
| Punkt | Einzelheiten | Hinweis |
|---|---|---|
| Testtafel | Herstellerdefinition | Empfohlen werden kontrastreiche Testtafeln mit mittlerer Ortsfrequenz, etwa Schachbrett- oder Rautenmuster. |
| Beleuchtungsstärke der Testfläche |
Mehr als 400Lux | Das Bild darf nicht flimmern. |
| Abstand zwischen Modul und Testtafel |
INF:2~5m Marco:10-20cm (Einzelheiten siehe Schärfentiefentabelle) |
Für INF wird die Teleposition mit einem Telekonverter simuliert. |
| Ausrichtung bei der Modulkorrektur |
Bei der INF-/MACRO-Korrektur liegt die optische Achse des Moduls horizontal. |
Bei Open-Loop-VCM wird nur horizontal korrigiert. Bei Closed-Loop-VCM kann die optische Achse zur Korrektur nach oben gerichtet sein. Die Richtung der Inf-/Macro-Korrektur muss gleich sein. |
| Verstärkungseinstellungen | Wie bei AWB | Die digitale Verstärkung ist fest 1; analoge Verstärkung: bei traditionellem PD oder 2x1OCL again auf 1x, bei Dual-Photodiode-PD again auf 2x setzen. |
| Sensoreinstellungen | mirror/flip/OB und Defektpixelentfernung im Sensor deaktivieren |
|
| Anforderungen an die Bildhelligkeit |
Wie bei AWB | Bei Darstellung in voller Größe beträgt der Mittelwert der hellsten 10% des G-Kanals in der mittleren ROI von 1/32W*1/32H 800LSB (raw10); der Mittelwert des Dual-PD-G-Kanals beträgt 700LSB (raw10). |
| Anzahl der Prüfmuster für die Fehlerprüfung |
Bereichsprüfung: Jedes Modul muss genau geprüft werden; mehr als 10pcs. |
Schlägt der Test fehl, muss das Korrekturverfahren angepasst werden, um die AF-Korrektur für Fern- und Nahfokus zu präzisieren. |
(4) Unterstützt das Modul OIS, muss vor der LSC- und PDAF-Kalibrierung die Verwacklungskorrektur abgeschlossen werden. Bewegen Sie den Motor zur XY-Referenzposition, um die OIS-Konfiguration zu überprüfen. Dieser Schritt erzeugt homogene Feldbilder für die LSC- und PDAF-Indexierung.
(5) Schließen Sie Schwarzpegel- und LSC-Korrektur ab. Falls erforderlich, kann die Bildfeldwölbung korrigiert werden.
- AE-Einstellungen des Moduls
(1) AE-Einstellung des Moduls: Die digitale Verstärkung ist fest 1. Analoge Verstärkung: Bei traditionellem PD oder 2x1OCL wird again auf 1x gesetzt; bei Dual-Photodiode-PD auf 2x, um Pixel-Blooming zu vermeiden.
(2) Belichtungszeit: Um Ladungs-Blooming bei Dual-PD und Überbelichtung normaler Pixel (regular_pixel=dual_pd_l+dual_pd_r) zu vermeiden, passen Sie die Belichtungszeit so an, dass bei Darstellung in voller Größe die Helligkeit des G-Kanals im mittleren Bereich 700 (raw10) beträgt. Bei OCL- und Metal-Shield-Typen muss die G-Kanal-Helligkeit im Zentrum 800 (raw10) betragen. Für den Sensor wird eine Belichtungszeit als ganzzahliges Vielfaches von 10ms empfohlen, um Netzfrequenzstörungen zu vermeiden.
2.2 Gain-Map-Kalibrierung
- Lichtumgebung und Ausrüstung
D50 (5000K±100K), unter Vermeidung von Störlicht aus der Umgebung.
Homogenisator oder DNP-Lichtbox entsprechend der obigen Lichtquelle; Ulbricht-Kugel.
- Aufnahmeverfahren

Technische Abbildung aus der englischen Quelle, PDF S. 16.
- Platzieren Sie das Modul vor der homogenen Flächenlichtquelle und halten Sie seine Stirnfläche parallel zur Lichtquellenfläche. Bei der im Versuch verwendeten Ulbricht-Kugel wird die Flächenhelligkeit beispielsweise auf 6.6 eingestellt. Platzieren Sie den Homogenisator vor dem Objektiv, damit die Flächenlichtquelle das Bild ausfüllt.
- Sensorverstärkung: Bei Metal-Shield- und 2x1OCL-Sensoren again und dgain auf 1x setzen. Bei Dual-PD-Sensoren again auf 2x und dgain auf 1x setzen; die Belichtungszeit auf Vielfache von 10 einstellen.
- Deaktivieren Sie Sensoreinstellungen wie mirro/flip/OB.
- Bei Darstellung in voller Größe beträgt der Mittelwert der hellsten 10% des G-Kanals in der mittleren ROI von 1/32W*1/32H 800LSB (raw10) oder 200LSB (raw8). Der Mittelwert des Dual-PD-G-Kanals beträgt 700LSB (raw10) oder 175LSB (raw8).
- Schalten Sie die Kamera ein und lassen Sie sie 3 Minuten aufwärmen. Bewegen Sie den Motor in die mittlere Position und nehmen Sie 3 RAW-Bilder nacheinander auf. Prüfen Sie zuerst, ob die Anzahl defekter Pixel den zulässigen Bereich überschreitet. Ist dies der Fall, verringern Sie die Bildhelligkeit und nehmen Sie erneut auf. Wird die Defektpixelprüfung bestanden, bilden Sie die gemittelten Bilddaten.
- Kalibrierung
Der Aufruf von pdaf_gainmap_calibration (…) erzeugt die Gain-Map-Daten und liefert deren Größe: gainmap_width*gainmap_height *2 Bytes, einschließlich linker und rechter Gain Map.
- Verifikation
1. Stellen Sie dieselbe Umgebung wie in Schritt 2 sicher und nehmen Sie ein Testbild auf. Übergeben Sie die kalibrierte Gain Map und das Testbild an pdaf_gainmap_vertification (…). Bei Rückgabe 1 ist die Verifikation erfolgreich und die kalibrierte Gain Map verwendbar. Bei Rückgabe -1 prüfen Sie, ob die Anzahl defekter Pixel den zulässigen Bereich überschreitet; verringern Sie die Bildhelligkeit und nehmen Sie erneut auf.
2. Verifikationskriterien
Beträgt der Unterschied zwischen dem durch die Gain Map korrigierten linken und rechten PD-Pixel weniger als 5%, ist die Verifikation erfolgreich.
2.3 DCC-Map-Kalibrierung
DCC (defocus conversion coefficient, Defokus-Umrechnungskoeffizient) beschreibt die Beziehung zwischen Motorposition und Unterschieden des linken und rechten Bildes. Das Bild wird in Bereiche aufgeteilt, der Motor in gleichen Schritten bewegt und der PD-Wert an verschiedenen Positionen berechnet. Durch lineare Regression werden die DCC-Werte der einzelnen Bereiche bestimmt: DCCMAP.

DCC = Δlensposition[dac]/Δphasedisparity[pixel]

Technische Abbildung aus der englischen Quelle, PDF S. 17.
[optional]
Bei manchen Modulen muss PD_OFFSET kalibriert werden. Beispielsweise ergibt sich bei der Motorposition DAC_0 ein unscharfes Fokusbild; die berechnete scharfe Fokusposition lautet DAC = DAC_0 + PD * DCC + PD_OFFSET * DCC.
- Lichtumgebung und Ausrüstung
D50 (5000K±100K), unter Vermeidung von Störlicht aus der Umgebung.
Homogenisierungsfolie oder DNP-Lichtbox entsprechend der obigen Lichtquelle, Ulbricht-Kugel und Schwarz-Weiß-Referenztafel.
Referenztafel: Sie besteht aus einer individuell gefertigten lichtdurchlässigen Folie mit gleichmäßig angeordneten schwarzen und weißen Streifen oder einem Rautengitter.

Technische Abbildung aus der englischen Quelle, PDF S. 17.

Technische Abbildung aus der englischen Quelle, PDF S. 18.

Technische Abbildung aus der englischen Quelle, PDF S. 18.
Der Kalibrierabstand a wird im Schritt zur AF-Grundkorrektur 2.1.1 bestimmt.
Die Breite der Referenztafel hängt vom horizontalen FOV des Objektivs und vom Kalibrierabstand a ab. Empfohlen wird:

S >= a * tan(FOV * pi/360) * 2/0.9
Der Kalibrierabstand wird im Schritt zur AF-Grundkorrektur 2.1.1 bestimmt.
Die Breite der Referenztafel hängt vom horizontalen FOV des Objektivs und vom Kalibrierabstand a ab. Empfohlen wird:

λ[mm] = (u[um]/1000) * raw_width/(6 * dccmap_width)

W[mm] = (a[mm] - f[mm])/f[mm] * λ[mm]
Für IMX258 wird der Koeffizient λ=0.11 empfohlen, für S5KJN1 λ=0.088~0.099.
Die DCC-Kalibrierung verlangt eine korrekt angefertigte und platzierte Referenztafel. Ungeeignete Streifenbreiten, Verdrehung oder Verformung beim Aufstellen sowie zu geringe Helligkeit oder Überbelichtung führen zum Scheitern der DCC-Kalibrierung. Die folgende Abbildung zeigt einige Fehlerfälle.

Technische Abbildung aus der englischen Quelle, PDF S. 18.
- Aufnahmeverfahren
- Platzieren Sie die Streifenfolie vor der Ulbricht-Kugel und das Modul vor der Referenztafel ungefähr in der mittleren Fokusposition. Der Abstand wird durch die AF-Grundkorrektur in Schritt 2.1.1 bestimmt. Halten Sie die Stirnfläche parallel zur Referenztafel; vermeiden Sie Drehung, Neigung und Verwindung der Tafel. Das Muster muss bei der Aufnahme das gesamte Bild ausfüllen.
- Sensorverstärkung: Bei Metal-Shield- und 2x1OCL-Sensoren again und dgain auf 1x setzen; bei Dual-PD-Sensoren again auf 2x und dgain auf 1x.
- Deaktivieren Sie mirro/flip/OB und Defektpixelentfernung im Sensor.
- Belichtung: Stellen Sie sicher, dass der Mittelwert des G-Kanals im weißen Block der mittleren ROI von 1/32w*1/32h auf der Referenztafel 800LSB (raw10) beziehungsweise 200LSB (raw8) beträgt. Der Mittelwert des Dual-PD-G-Kanals muss 700LSB (raw10) oder 175LSB (raw8) betragen, damit unzureichende Helligkeit oder Überbelichtung die DCC-Kalibrierungsgenauigkeit nicht beeinträchtigen. Bei Metal-Shield-Sensoren dürfen die nicht abgeschirmten Pixel nicht überbelichtet sein.
- Bewegen Sie den Motor von DCC_LENS_BEGIN bis DCC_LENS_END in Schritten von DCC_LENS_INTERVAL. Nehmen Sie nach jeder Stabilisierung des Motors drei RAW-Bilder auf und bilden Sie die gemittelten Bilddaten für jede Position. Im Versuch wurde der Code beispielsweise von 0 bis 64 in Schritten von 8 verändert; dies ergab insgesamt 9 Positionen und 27 Bilder.
- Kalibrierung
Übergeben Sie die in Abschnitt 2.1 kalibrierte Gain Map, die Motorpositionsparameter und die gemittelten Bilddaten jeder Position an pdaf_dccmap_calibration (…), um die DCC-Map-Daten und deren Größe zu erhalten.
Die Größe beträgt dccmap _width*dccmap _height *2 Bytes. Bei gewählter PD_OFFSET-Kalibrierung beträgt die Wertgröße ebenfalls 2bytes; die Quelle nennt hierbei DCC_RSQ_THRESHOLD. Überschreitet die Anzahl der Blöcke, die den Linearitätsschwellenwert nicht erfüllen, einen bestimmten Wert, schlägt die Kalibrierung fehl. Prüfen Sie dann die Eingabedaten, passen Sie die Kalibrierumgebung an und nehmen Sie erneut auf.
- Verifikation
Dieser Schritt prüft, ob die aktuell kalibrierte DCC Map korrekt ist. Der Prüfablauf ist nachfolgend dargestellt:

Technische Abbildung aus der englischen Quelle, PDF S. 19.
1. Die Beleuchtungsumgebung der Prüfaufnahmen muss der DCC-Map-Kalibrierumgebung entsprechen. Die Objektivfläche ist parallel zur Referenztafel auszurichten, sodass deren Muster bei der Aufnahme das Bild vollständig ausfüllt.
2. Schalten Sie die Kamera ein und lassen Sie sie 3 Minuten aufwärmen. Stellen Sie den Motor auf eine Position DAC0 mit unscharfem Bild:

DAC0 ∈ (DACinf + 0.2 * abs(DACinf - DACmacro), DACinf + 0.8 * abs(DACinf - DACmacro)]
Nehmen Sie nach Stabilisierung des Motors drei RAW-Bilder auf und mitteln Sie die Bilddaten. Übergeben Sie die aktuelle Motorposition DAC0, die gemittelten Bilddaten sowie die kalibrierte Gain Map und DCC Map an pdaf_dccmap_vertification(). Die Funktion berechnet aus der unscharfen Aufnahme die ideale Fokusposition DAC1.
3. Bewegen Sie den Motor anschließend auf DAC1 und nehmen Sie fünf Bilder im Bereich tolerance_factor*abs(DACinf-DACmacro)+Δ (beispielsweise Δ=2) vor und hinter DAC1 auf. tolerance_factor bezeichnet den Toleranzbereich der Verifikation; der Fehlerbereich unterscheidet sich nach Sensortyp, beispielsweise 5%, 10% oder 20%.
Bewegen Sie den Motor während der Verifikation von Position 1 bis Position 5. Die fünf Positionen lauten beispielsweise für tolerance_factor=10% und Δ=2:
4.
| Index | Position |
|---|---|
| 1 | DAC1-10% *abs(DACinf-DACmacro)-Δ |
| 2 | DAC1-10% *abs(DACinf-DACmacro) |
| 3 | DAC1 |
| 4 | DAC1+10% *abs(DACinf-DACmacro) |
| 5 | DAC1+10% *abs(DACinf-DACmacro)+Δ |
5. Übergeben Sie die fünf Bilder an pdaf_calc_sharpness (…). Berechnen Sie die Schärfe im mittleren Bildbereich DCC_PERCENT_ROI_W* DCC_PERCENT_ROI_H, beispielsweise 30%*30%, und prüfen Sie, ob ein Maximum vorliegt. Ist dies der Fall, ist die Verifikation erfolgreich. Schlägt sie fehl, erweitern Sie den Bereich von tolerance_factor und Δ, etwa Δ von 2 auf 5, nehmen Sie erneut 5 Bilder auf und wiederholen Sie Schritt 4. Zur Schärfeberechnung sollte vorzugsweise ein Kanal mit wenigen PD-Pixeln gewählt werden.

Technische Abbildung aus der englischen Quelle, PDF S. 20.
3 Kalibrierungsverfahren
Zu den kalibrierten Modulen gehören AWB (automatischer Weißabgleich), LSC (Objektivabschattungskorrektur) und PDAF (Phasendetektions-Autofokus).
3.1 AWB-Kalibrierung
【Funktionsbeschreibung】
Diese Funktion berechnet R/G, B/G und Gr/Gb der ROI eines RAW-Bildes.
【Funktionsprototyp】
bool awb_otp_Calibrate(uint16_t* RawAddr, int width, int height, int roiw,
int roih, int bits, int bayer, int blc_r, int blc_gr,
int blc_gb, int blc_b, uint16_t* R, uint16_t* Gr,
uint16_t*Gb, uint16_t* B, uint16_t* R_G, uint16_t* B_G,
uint16_t* Gr_Gb)
【Eingabeinformationen】
| Parametername | Beschreibung |
|---|---|
| RawAddr | Vom aktuellen Modul in der Fertigung aufgenommene RAW-Bilddaten |
| width | Breite des RAW-Bildes |
| height | Höhe des RAW-Bildes |
| bits | Anzahl Bits pro Pixel. 10bit=10 |
| roiw | Kehrwert des Verhältnisses von ROI-Breite zu Bildbreite |
| roih | Kehrwert des Verhältnisses von ROI-Höhe zu Bildhöhe |
| bayer | Bayer-Muster für RAW-Bilder. BGGR=0, GBRG=1,GRBG=2, RGGB=3 |
| blc_r | BLC des R-Kanals |
| blc_gr | BLC des Gr-Kanals |
| blc_gb | BLC des Gb-Kanals |
| blc_b | BLC des B-Kanals |
【Ausgabeinformationen】
| Parametername | Beschreibung |
|---|---|
| R | Mittelwert des R-Kanals in der ROI |
| Gr | Mittelwert des Gr-Kanals in der ROI |
| Gb | Mittelwert des Gb-Kanals in der ROI |
| B | Mittelwert des B-Kanals in der ROI |
| R_G | Verhältnis des R-Kanal-Mittelwerts zum Gb-Kanal-Mittelwert in der ROI *1024 |
| B_G | Verhältnis des B-Kanal-Mittelwerts zum Gb-Kanal-Mittelwert in der ROI *1024 |
| Gr_Gb | Verhältnis des Gr-Kanal-Mittelwerts zum Gb-Kanal-Mittelwert in der ROI *1024 |
【Rückgabewert】
=0: Der Parameter ist fehlerhaft.
=1: Die Kalibrierung war erfolgreich.
3.2 LSC-Kalibrierung
3.2.1 LSC-Kalibrierung
【Funktionsbeschreibung】
Diese Funktion berechnet die Verstärkung jedes Kanals des RAW-Bildes.
【Funktionsprototypen】
bool lsc_otp_Calibrate(int vig,uint16_t* RawAddr, int width, int height,
int bits, int bayer, int blc_r, int blc_gr,
int blc_gb, int blc_b, float ratio, uint16_t* lsc_otp)
【Eingabeinformationen】
| Parametername | Beschreibung |
|---|---|
| vig | LSC-Korrekturstärke, Standard vig=70 (%) |
| RawAddr | Vom aktuellen Modul in der Fertigung aufgenommene RAW-Bilddaten |
| width | Breite des RAW-Bildes |
| height | Höhe des RAW-Bildes |
| bits | Anzahl Bits pro Pixel. 10bit=10 |
| bayer | Bayer-Muster für RAW-Bilder. BGGR=0, GBRG=1,GRBG=2, RGGB=3 |
| blc_r | BLC des R-Kanals |
| blc_gr | BLC des Gr-Kanals |
| blc_gb | BLC des Gb-Kanals |
| blc_b | BLC des B-Kanals |
| ratio | Schwellenwert zur Beurteilung der Symmetrie der Randabschattung; empfohlen: ratio=1.5 |
【Ausgabeinformationen】
| Parametername | Beschreibung |
|---|---|
| lsc_otp | LSC-Verstärkung: ● R-Kanal-Verstärkung(17 * 17) ● Gr-Kanal-Verstärkung(17 * 17) ● Gb-Kanal-Verstärkung(17 * 17) ● B-Kanal-Verstärkung(17 * 17) |
【Rückgabewert】
=0: Die LSC-Kalibrierungsdaten und die Randabschattung sind fehlerhaft.
=1: Kalibrierung erfolgreich.
3.2.2 LSC-Verifikation
【Funktionsbeschreibung】
Diese Funktion prüft die Ergebnisse der LSC-Kalibrierung.
【Funktionsprototypen】
bool lsc_otp_verify(uint16_t *RawAddr, int width, int height, int bits,
int bayer, int blc_r, int blc_gr, int blc_gb,
int blc_b, uint16_t *lsc_otp, int Ydiffer_down,
int Ydiffer_up, int ColorShading_down,
int ColorShading_up, float *fYdiffer,
float *fRGCorner,float *fBGCorner)
【Eingabeinformationen】
| Parametername | Beschreibung |
|---|---|
| RawAddr | Vom aktuellen Modul in der Fertigung aufgenommene RAW-Bilddaten |
| width | Breite des RAW-Bildes |
| height | Höhe des RAW-Bildes |
| bits | Anzahl Bits pro Pixel. 10bit=10 |
| bayer | Bayer-Muster für RAW-Bilder. BGGR=0, GBRG=1,GRBG=2, RGGB=3 |
| blc_r | BLC des R-Kanals |
| blc_gr | BLC des Gr-Kanals |
| blc_gb | BLC des Gb-Kanals |
| blc_b | BLC des B-Kanals |
| lsc_otp | Von lsc_otp_Calibrate berechnete Ausgabe lsc_otp |
| Ydiffer_down | Untergrenze des Prüfkriteriums YShading_Corner_Max - YShading_Corner_Min nach Kalibrierung, in Prozent |
| Ydiffer_up | Obergrenze des Prüfkriteriums YShading_Corner_Max - YShading_Corner_Min nach Kalibrierung, in Prozent |
| ColorShading_down | Untergrenze des Prüfkriteriums nach Kalibrierung | (R/G_Corner)/(R/G_Center)-1|、|(B/G_Corner)/(B/G_Center)-1|, in Prozent |
| ColorShading_up | Obergrenze des Prüfkriteriums nach Kalibrierung | (R/G_Corner)/(R/G_Center)-1|、|(B/G_Corner)/(B/G_Center)-1|, in Prozent |
【Ausgabeinformationen】
| Parametername | Beschreibung |
|---|---|
| fYdiffer | Wert von YShading_Corner_Max - YShading_Corner_Min |
| fRGCorner | Wert jedes Blocks |(R/G_Corner)/(R/G_Center)-1|, insgesamt 5 x 5 Blöcke |
| fBGCorner | Wert jedes Blocks |(B/G_Corner)/(B/G_Center)-1|, insgesamt 5 x 5 Blöcke |
【Rückgabewert】
=0: Die Prüfkriterien nach der Kalibrierung werden nicht erfüllt; die Verifikation schlägt fehl.
=1: Verifikation erfolgreich.
3.3 PDAF-Kalibrierung
3.3.1 Sensorkonfiguration abrufen
【Funktionsbeschreibung】
Konfigurieren Sie sensor.ini und lesen Sie die Informationen zum PD-Sensor aus dieser Datei.
【Konfigurationsinhalt】
[sensor config]
| Schlüsselwörter | Beschreibung |
|---|---|
| RAW_WIDTH | RAW-Bildbreite |
| RAW_HEIGHT | RAW-Bildhöhe |
| RAW_BITS | Bitbreite des Pixelwerts |
| RAW_BLACK_LEVEL | Schwarzpegelwert |
| RAW_BAYER_PATTERN | Bayer-Muster des RAW-Bildes. 0:BGGR,1:GBRG,2:GRBG,3:RGGB |
| SENSOR_TYPE | 0:shieldPD oder 1x2OCL 1: horizontal und vertikal (LR&TB) 2: reserviert 3:reserviert |
| PD_DUAL_MODE | 0:kein Dual-PD 1:Dual-PD |
| PD_BINNING_TYPE | Kalibrierung mit Binning-PD 0:OFF 1:ON |
| MIPI_MIX_MODE | 0:Daten enthalten nur RAW- oder PD-Daten 1:Daten enthalten RAW- und PD-Daten; nur wirksam bei PD_DUAL_MODE=1 |
| PD_OFFSET_X | x-Offset des PD-Blocks |
| PD_OFFSET_Y | y-Offset des PD-Blocks |
| PD_PITCH_X | x-Rasterabstand des PD-Blocks |
| PD_PITCH_Y | y-Rasterabstand des PD-Blocks |
| PD_DENSITY_X | x-Abstand eines Paars linker/rechter PD-Pixel |
| PD_DENSITY_Y | y-Abstand eines Paars linker/rechter PD-Pixel |
| PD_BLOCK_NUM_X | Gesamtzahl der PD-Blöcke in x-Richtung |
| PD_BLOCK_NUM_Y | Gesamtzahl der PD-Blöcke in y-Richtung |
| CALB_S_LEVEL | Sättigungspegel, Standard 100 |
| CALB_S_CNT | Sättigungsanzahl, Standard 10 |
| PD_POS_L | Position des linken PD-Pixels innerhalb eines PD-Blocks |
| PD_POS_R | Position des rechten PD-Pixels innerhalb eines PD-Blocks |
Dual-Typ
[sensor config]
| Schlüsselwörter | Beschreibung |
|---|---|
| RAW_WIDTH | RAW-Bildbreite |
| RAW_HEIGHT | RAW-Bildhöhe |
| LR_WIDTH | PD-Bildbreite |
| LR_HEIGHT | PD-Bildhöhe |
| RAW_BITS | Bitbreite des Pixelwerts |
| RAW_BLACK_LEVEL | Schwarzpegelwert |
| RAW_BAYER_PATTERN | Bayer-Muster des RAW-Bildes. 0:BGGR,1:GBRG,2:GRBG,3:RGGB |
| SENSOR_TYPE | 0:shieldPD oder 1x2OCL 1: horizontal und vertikal (LR&TB) 2:reserviert 3:reserviert |
| PD_DUAL_MODE | 0:kein Dual-PD 1:Dual-PD |
| PD_BINNING_TYPE | Kalibrierung mit Binning-PD 0:OFF 1:ON |
| MIPI_MIX_MODE | 0:Daten enthalten nur RAW- oder PD-Daten 1:Daten enthalten RAW- und PD-Daten; nur wirksam bei PD_DUAL_MODE=1 |
| PD_OFFSET_X | x-Offset des PD-Blocks |
| PD_OFFSET_Y | y-Offset des PD-Blocks |
| PD_PITCH_X | x-Rasterabstand des PD-Blocks |
| PD_PITCH_Y | y-Rasterabstand des PD-Blocks |
| PD_DENSITY_X | x-Abstand eines Paars linker/rechter PD-Pixel |
| PD_DENSITY_Y | y-Abstand eines Paars linker/rechter PD-Pixel |
| PD_BLOCK_NUM_X | Gesamtzahl der PD-Blöcke in x-Richtung |
| PD_BLOCK_NUM_Y | Gesamtzahl der PD-Blöcke in y-Richtung |
| CALB_S_LEVEL | Sättigungspegel, Standard 100 |
| CALB_S_CNT | Sättigungsanzahl, Standard 10 |
| PD_POS_L | Position des linken PD-Pixels innerhalb eines PD-Blocks |
| PD_POS_R | Position des rechten PD-Pixels innerhalb eines PD-Blocks |
[Gainmap_Calib]
| Schlüsselwörter | Beschreibung |
|---|---|
| GAINMAP_BLKSZ_W | Breite eines Gain-Map-Blocks |
| GAINMAP_BLKSZ_H | Höhe eines Gain-Map-Blocks |
| GAIN_CALIB_INPUT_MAX | Maximaler Eingangs-RAW-Bildpegel:920(raw10) |
| GAIN_CALIB_INPUT_MIN | Minimaler Eingangs-RAW-Bildpegel:800(raw10) |
| GAIN_VERIFY_DIFF_MAX | L/R-Differenzschwelle nach Verstärkung (5%*1024) |
| CROSS_VER | Gain Map anhand anderer Bilder prüfen |
[DCCmap_Calib]
| Schlüsselwörter | Beschreibung |
|---|---|
| DCCMAP_BLKSZ_W | Breite eines DCC-Map-Blocks |
| DCCMAP_BLKSZ_H | Höhe eines DCC-Map-Blocks |
| DCC_CALIBRATE_MODE | DCC-Kalibrierungsmodus, Standard 1 |
| DCC_LENS_BEGIN | Startposition der DAC-Code-Abtastung |
| DCC_LENS_END | Endposition der DAC-Code-Abtastung |
| DCC_LENS_INTERVAL | Abtastintervall des DAC-Codes |
| DCC_RSQ_THRESHOLD | Schwellenwert der rsq-Matrix |
| DCC_BORDER_RSQ_THRESHOLD | Schwellenwert der rsq-Randmatrix |
| DCC_BAD_RSQ_NUM_RATIO | Anteil fehlerhafter rsq-Matrizen |
| DCC_CALIB_INPUT_MAX | Maximaler Eingangs-RAW-Bildpegel:640(raw10) oder 160(raw8) |
| DCC_CALIB_INPUT_MIN | Minimaler Eingangs-RAW-Bildpegel:340(raw10) oder 85(raw8) |
| DCC_CALIB_PD_RANGE | Suchradius für Pixeldisparität |
| DCC_VERIFY_CAF_DIFF_MAX | Schwellenwert (%) für den DAC-Bereich |
| DCC_VERIFY_CAF_DIFF_DET | delta(DAC) für den DAC-Bereich |
| CALIB_TARGET_PEAK_OFFSET_LOG | FV-Spitzenwertinformationen in PDAFFVLog.txt speichern.1:ON,0:OFF |
| CALIB_TARGET_PEAK_OFFSET | PD-Zieloffset im FV-Spitzenwertkriterium, Standard:0 |
| DCC_PERCENT_ROI_W | ROI-Breite des Testbildes |
| DCC_PERCENT_ROI_H | ROI-Höhe des Testbildes |
| DCC_SHARPNESS_MODE | Modus der Schärfeberechnung, Standard 1 |
| DCC_SHARPNESS_CHL | Kanal der Schärfeberechnung,0:ursprüngliches RAW;1:Rot,2:Grün(Standard),3:Blau,4:Demosaic |
[optional params]
| Schlüsselwörter | Beschreibung |
|---|---|
| QUALITY_VERIFY_ENABLE | Qualitätsprüfung bei der Gain-Map-Kalibrierung aktivieren |
| QUALTI_LRDiff_L_MIN | L/R-Differenzkriterien (Block1,2,3) |
| QUALTI_LRDiff_L_MAX | L/R-Differenzkriterien (Block1,2,3) |
| QUALTI_LRDiff_C_MIN | L/R-Differenzkriterien (Block4,5,6) |
| QUALTI_LRDiff_C_MAX | L/R-Differenzkriterien (Block4,5,6) |
| QUALTI_LRDiff_R_MIN | L/R-Differenzkriterien (Block7,8,9) |
| QUALTI_LRDiff_R_MAX | L/R-Differenzkriterien (Block7,8,9) |
| QUALITY_SENSITIVITY_MIN | Empfindlichkeitskriterium |
【Beispiel】
Als Beispiel dient die in der folgenden Abbildung gezeigte PD-Pixelverteilung des IMX258:

Technische Abbildung aus der englischen Quelle, PDF S. 30.
Entsprechend den Informationen in der Abbildung lautet der Inhalt von sensor.ini:
[sensor config]
RAW_WIDTH =4208
RAW_HEIGHT =3120
RAW_BITS =12
RAW_BLACK_LEVEL =64
RAW_BAYER_PATTERN =0
SENSOR_TYPE=0
PD_DUAL_MODE=0
PD_BINNING_TYPE=0
PD_OFFSET_X =24
PD_OFFSET_Y =24
PD_PITCH_X =32
PD_PITCH_Y =32
PD_DENSITY_X =16
PD_DENSITY_Y =16
PD_BLOCK_NUM_X =130
PD_BLOCK_NUM_Y =96
CALB_S_LEVEL=1000
CALB_S_CNT=10
PD_POS_L=
[26 29]
[42 29]
[33 48]
[49 48]; #end with a ";"
PD_POS_R=
[25 32]
[41 32]
[34 45]
[50 45]; #end with a ";"
[Gainmap_Calib]
GAINMAP_BLKSZ_W=16
GAINMAP_BLKSZ_H=16
GAIN_CALIB_INPUT_MAX=920
GAIN_CALIB_INPUT_MIN=800
GAIN_VERIFY_DIFF_MAX=5
CROSS_VER=1
[DCCmap_Calib]
DCCMAP_BLKSZ_W=32
DCCMAP_BLKSZ_H=32
DCC_CALIBRATE_MODE=1
DCC_LENS_BEGIN=0
DCC_LENS_END=64
DCC_LENS_INTERVAL=8
DCC_RSQ_THRESHOLD=0.985
DCC_BORDER_RSQ_THRESHOLD=0.97
DCC_BAD_RSQ_NUM_RATIO=0.05
DCC_CALIB_INPUT_MAX=640
DCC_CALIB_INPUT_MIN=340
DCC_VERIFY_CAF_DIFF_MAX=10
DCC_VERIFY_CAF_DIFF_DET=2
CALIB_TARGET_PEAK_OFFSET_LOG=0
CALIB_TARGET_PEAK_OFFSET=0
DCC_PERCENT_ROI_W=0.4
DCC_PERCENT_ROI_H=0.4
DCC_SHARPNESS_MODE=1
DCC_SHARPNESS_CHL=1
[optional params]
QUALITY_VERIFY_ENABLE=1
QUALTI_LRDiff_L_MIN=0.4
QUALTI_LRDiff_L_MAX=2.5
QUALTI_LRDiff_C_MIN=0.55
QUALTI_LRDiff_C_MAX=1.8
QUALTI_LRDiff_R_MIN=0.4
QUALTI_LRDiff_R_MAX=2.5
QUALITY_SENSITIVITY_MIN=0.45
【Funktionsprototypen】
bool pdaf_initial(char* filename, sensor_cfg* psensor_cfg)
【Eingabeinformationen】
| Parametername | Beschreibung |
|---|---|
| filename | Vollständiger Pfad der Datei sensor.ini |
【Ausgabeinformationen】
| Parametername | Beschreibung |
|---|---|
| psensor_cfg | Zeiger auf eine Struktur mit dem Inhalt von sensor.ini |
【Rückgabewert】
=0: sensor.ini konnte nicht gelesen werden.
=1: sensor.ini erfolgreich gelesen.
3.3.2 Gain-Map-Kalibrierung
【Funktionsbeschreibung】
Diese Funktion dient der Kalibrierung von PDAF-Gain-Maps.
【Funktionsprototypen】
bool pdaf_gainmap_calibration(uint16_t *RawAddr, sensor_cfg* psensor_cfg,
uint16_t *gainmap_lut,int* gainmap_width,
int* gainmap_height)
【Eingabeinformationen】
| Parametername | Beschreibung |
|---|---|
| RawAddr | Vom aktuellen Modul in der Fertigung aufgenommene RAW-Bilddaten |
| psensor_cfg | Zeiger auf eine Struktur mit dem Inhalt von sensor.ini |
【Ausgabeinformationen】
| Parametername | Beschreibung |
|---|---|
| gainmap_lut | Kalibrierte Gain Map |
| gainmap_width | Breite der kalibrierten Gain Map |
| gainmap_height | Höhe der durch Kalibrierung ermittelten Gain Map |
【Rückgabewert】
=0: Der Parameter ist fehlerhaft.
=1: Kalibrierung erfolgreich.
3.3.3 Gain-Map-Verifikation
【Funktionsbeschreibung】
Diese Funktion prüft, ob die kalibrierte Gain Map die Anforderungen erfüllt.
【Funktionsprototypen】
bool pdaf_gainmap_vertification(uint16_t *RawAddr, sensor_cfg* psensor_cfg,
uint16_t *gainmap_lut)
【Eingabeinformationen】
| Parametername | Beschreibung |
|---|---|
| RawAddr | Vom aktuellen Modul in der Fertigung aufgenommene RAW-Bilddaten |
| psensor_cfg | Zeiger auf eine Struktur mit dem Inhalt von sensor.ini |
| gainmap_lut | Mit pdaf_gainmap_calibration ermittelte Gain Map |
【Rückgabewert】
=0: Die Verifikation ist fehlgeschlagen; die dafür verwendete Gain Map erfüllt die Anforderungen nicht.
=1: Verifikation erfolgreich.
3.3.4 DCC-Map-Kalibrierung
【Funktionsbeschreibung】
Diese Funktion dient der Kalibrierung der PDAF-DCC-Map.
【Funktionsprototypen】
bool pdaf_dccmap_calibration(uint16_t *RawAddrAll , sensor_cfg* psensor_cfg,
uint16_t *gainmap_lut, uint16_t *dccmap_lut,
int* dccmap_width,int* dccmap_height,
uint8_t* dccSign,wchar_t*pd_offset)
【Eingabeinformationen】
| Parametername | Beschreibung |
|---|---|
| RawAddrAll | Sequenz der gemittelten Bilddaten für jede Motorposition |
| psensor_cfg | Zeiger auf eine Struktur mit dem Inhalt von sensor.ini |
| gainmap_lut | Mit pdaf_gainmap_calibration ermittelte Gain Map |
【Ausgabeinformationen】
| Parametername | Beschreibung |
|---|---|
| dccmap_lut | Resultierende DCC Map |
| dccmap_width | Breite der kalibrierten DCC Map |
| dccmap_height | Höhe der kalibrierten DCC Map |
| dccSign | Richtung der durch Kalibrierung ermittelten DCC Map |
| pd_offset | Durch Kalibrierung ermittelter pd_offset |
【Rückgabewert】
=0: Kalibrierung fehlgeschlagen.
=1: Kalibrierung erfolgreich.
3.3.5 DCC-Map-Verifikation
Prüft, ob die kalibrierte DCC Map die Anforderungen erfüllt. Dazu dienen die beiden Funktionsschnittstellen pdaf_dccmap_vertification() und pdaf_calc_sharpness().
【Funktionsbeschreibung】
Ermittelt anhand der kalibrierten DCC Map die ideale scharfe Fokusposition DAC1 des unscharfen Bildes.
【Funktionsprototyp】
uint16_t pdaf_dccmap_vertification(uint16_t *RawAddr, sensor_cfg* psensor_cfg,
int cur_pos_id, uint16_t *gainmap_lut,
uint16_t *dccmap_lut, uint8_t dccSign, wchar_t
*pd_offset)
【Eingabeinformationen】
| Parametername | Beschreibung |
|---|---|
| RawAddr | Gemittelte Bilddaten der aufgenommenen unscharfen Bilder |
| psensor_cfg | Strukturzeiger auf den Inhalt von sensor.ini |
| cur_pos_id | Aktuelle Motorposition bei Aufnahme des unscharfen Bildes |
| gainmap_lut | Mit pdaf_gainmap_calibration kalibrierte Gain Map |
| dccmap_lut | Mit pdaf_dccmap_calibration kalibrierte DCC Map |
| dccSign | Mit pdaf_dccmap_calibration kalibrierter dccSign |
| pd_offset | Mit pdaf_dccmap_calibration ermittelter pd_offset |
【Rückgabewert】
Motorposition DAC1, bei der das unscharfe Bild ideal fokussiert ist.
【Funktionsbeschreibung】
Berechnet die Schärfe des mittleren Bildbereichs innerhalb von DCC_VERIFY_CAF_DIFF_MAX*abs (DACinf- DACmacro)+DCC_VERIFY_CAF_DIFF_DET vor und hinter DAC1, um festzustellen, ob ein Maximum vorliegt.
【Funktionsprototyp】
bool pdaf_calc_sharpness(uint16_t *RawAddrAll, int img_num, sensor_cfg*
psensor_cfg)
【Eingabeinformationen】
| Parametername | Beschreibung |
|---|---|
| RawAddrAll | Sequenz gemittelter Bilddaten innerhalb von valid_toerance*abs (DACinf-DACmacro)+2 vor und hinter DAC1 |
| img_num | Anzahl der in RawAddrAll enthaltenen Bilder |
| psensor_cfg | Strukturzeiger auf den Inhalt von sensor.ini |
【Rückgabewert】
=0: Kein Schärfemaximum gefunden; Verifikation fehlgeschlagen.
=1: Verifikation erfolgreich.
4 Anhang
4.1 Beispielcode zur OTP-Anwendung
#include <iostream>
#include "RKOTPDLL.h"
#include <stdlib.h>
int main()
{
int ret = 0;
#LSC AWB Otp Calibration
ret =lsc_awbtest();
#Pdaf Otp Calibration
uint16_t gainmap[30*30 * 2];
uint16_t dccmap[20 * 20 * 2];
uint16_t code = 0;
int gainmap_width = 0;
int gainmap_height = 0;
int dccmap_width = 0;
int dccmap_height = 0;
uint8_t dcc_Sign = 0;
wchar_t pd_offset=0xffff;
int curpos = 864;
sensor_cfg sensor_param;
if (pdaf_initial("D:\\testdll\\testdll\\sensor_ov16A10.ini", &sensor_param))
{
if (gainmaptest(&sensor_param, gainmap,&gainmap_width,&gainmap_height))
{
if (dccmaptest(&sensor_param, gainmap, dccmap, curpos, &code,
&dccmap_width, &dccmap_height, &dcc_Sign,&pd_offset))
{
ret = dcc_calc_sharpness(&sensor_param);
}
}
}
}
bool lsc_awbtest()
{
int vig=70;
int height = 1944;
int width = 2592;
int bits =10;#10bit
int bayer =0;#BGGR
int roiw =5;#1/5 width
int roih =5;#1/5 height
int blc[4]={ 64, 64, 64, 64};
uint16_t lsctable[17*17*4];
uint16_t awb[3];
uint16_t Rave =0;
uint16_t Grave =0;
uint16_t Gbave =0;
uint16_t Bave =0;
int Ydiffer_down =0;#%
int Ydiffer_up =5;#%
int ColorShading_down =0;#%
int ColorShading_up =5;#%
float Ydiffer = 0;
float RGconer[25];
float BGconer[25];
bool ret =0;
uint16_t *Rawdata = NULL;
Rawdata = (uint16_t*)malloc(width * height * 2);
memset(Rawdata, 0, sizeof(uint16_t)* width * height);
FILE *fp = NULL;
fp = fopen("input.raw", "rb");
if (fp == NULL)
{
return false;
}
fread(Rawdata, 1, height * width * 2, fp);
fclose(fp);
ret =lsc_otp_Calibrate(vig,Rawdata, width, height, bits, bayer, blc[0],
blc[1],blc[2], blc[3],lsctable);
ret = awb_otp_Calibrate(Rawdata, width, height,roiw,roih, bits, bayer,
blc[0], blc[1],blc[2], blc[3],&Rave,&Grave,&Gbave,&Bave, &awb[0], &awb[1],
&awb[2]);
ret = lsc_otp_verify(Rawdata, width, height, bits, bayer, blc[0], blc[1],
blc[2], blc[3], lsctable, Ydiffer_down, Ydiffer_up, ColorShading_down,
ColorShading_up, &Ydiffer, RGconer, BGconer);
if(!ret)
{
return false; #The calibrated data does not meet the control standards and the verification fails.
}
if(Rawdata!=NULL)
{
free (Rawdata);
Rawdata =NULL;
}
return ret;
}
int gainmaptest(sensor_cfg* psensor_cfg, uint16_t *gainmap_lut,int *
gainmap_width, int *gainmap_height)
{
int ret = 0;
int height = psensor_cfg->height;
int width = psensor_cfg->width;
uint16_t maxval = (1 << psensor_cfg->bits) - 1;
int gainmapfilenum = 3;
int over_exp_cnt = 0;
if (psensor_cfg->pd_dual_mode && psensor_cfg->mipi_mix_mode)
{
height = psensor_cfg->height + (psensor_cfg->sensor_type+1)*psensor_cfg->pd_height;
}
uint16_t *ave_pixelbuf = NULL;
ave_pixelbuf = (uint16_t*)malloc(width * height * 2);
memset(ave_pixelbuf, 0, sizeof(uint16_t)* width * height);
uint16_t *sum_pixelbuf = NULL;
sum_pixelbuf = (uint16_t*)malloc(width * height * 2);
memset(sum_pixelbuf, 0, sizeof(uint16_t)* width * height);
uint16_t *pixelbuf = NULL;
pixelbuf = (uint16_t*)malloc(width * height * 2);
memset(pixelbuf, 0, sizeof(uint16_t)* width * height);
FILE *fp = NULL;
char prename[20] = "gainRAW";
char endname[5] = ".raw";
for (int i = 0; i < gainmapfilenum; i++)
{
char temp[20];
char id[5];
int idint = i + 1;
strcpy(temp, prename);
_itoa_s(idint, id, 10);
strcat(temp, id);
strcat(temp, endname);
fp = fopen(temp, "rb");
if (fp == NULL)
{
return false;
}
fread(pixelbuf, 1, height * width * 2, fp);
fclose(fp);
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
uint32_t tempbuf = *(pixelbuf + j*width + i);
*(sum_pixelbuf + j*width + i) = tempbuf + *(sum_pixelbuf +
j*width + i);
if (tempbuf >= maxval)
over_exp_cnt++;
}
}
}
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
*(ave_pixelbuf + j*width + i) = *(sum_pixelbuf + j*width + i) /
gainmapfilenum;
}
}
ret = pdaf_gainmap_calibration(ave_pixelbuf, psensor_cfg, gainmap_lut,
gainmap_width,gainmap_height);
ret = pdaf_gainmap_vertification(ave_pixelbuf, psensor_cfg, gainmap_lut);
if(ret == -1)
printf("gainmap image OVER exposure!!!");
if (ave_pixelbuf!=NULL)
{
free(ave_pixelbuf);
ave_pixelbuf = NULL;
}
if (pixelbuf != NULL)
{
free(pixelbuf);
pixelbuf = NULL;
}
if (sum_pixelbuf != NULL)
{
free(sum_pixelbuf);
sum_pixelbuf = NULL;
}
return ret;
}
bool dccmaptest(sensor_cfg* psensor_cfg, uint16_t *gainmap_lut, uint16_t
*dccmap_lut, int curpos , uint16_t *code, int *dccmap_width, int *dccmap_height,
uint8_t *dcc_Sign,wchar_t *pdaf_offset)
{
int ret = 0;
int lens_begin = 0;
int lens_end = 64;
int lens_interval = 8;
int height = psensor_cfg->height;
int width = psensor_cfg->width;
int lensnum = (lens_end - lens_begin) / lens_interval + 1;
if (psensor_cfg->pd_dual_mode && psensor_cfg->mipi_mix_mode)
{
height = psensor_cfg->height + (psensor_cfg->sensor_type +
1)*psensor_cfg->pd_height;
}
uint16_t *ave_pixelbuf = NULL;
ave_pixelbuf = (uint16_t*)malloc(width * height * 2);
memset(ave_pixelbuf, 0, sizeof(uint16_t)* width * height);
uint16_t *Rawdata = NULL;
Rawdata = (uint16_t*)malloc(width * height * 2 * lensnum);
memset(Rawdata, 0, sizeof(uint16_t)* width * height* lensnum);
uint16_t *pixelbuf= NULL;
pixelbuf = (uint16_t*)malloc(width * height * 2);
memset(pixelbuf, 0, sizeof(uint16_t)* width * height);
FILE *fp = NULL;
char prename[20] = "dccRAW";
char endname[5] = ".raw";
for (int a = 0;a <lensnum;a++)
{
char temp[20];
char id[5] ;
int id1 = a + 1;
strcpy(temp,prename);
_itoa_s(id1, id, 10);
strcat(temp, id);
for (int b = 0; b < 3;b++)
{
char name[20];
strcpy(name, temp);
int id2 = b + 1;
_itoa_s(id2, id, 10);
strcat(name, id);
strcat(name, endname);
fp = fopen(name, "rb");
if (fp == NULL)
{
return false;
}
fread(pixelbuf, 1, height * width * 2, fp);
fclose(fp);
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
uint16_t tempbuf = *(ave_pixelbuf + j*width + i);
*(ave_pixelbuf + j*width + i) = tempbuf + *(pixelbuf +
j*width + i) / 3;
}
}
}
memcpy(Rawdata + a*height * width, ave_pixelbuf, sizeof(uint16_t)*height
* width);
memset(ave_pixelbuf, 0, sizeof(uint16_t)* width * height);
}
ret = pdaf_dccmap_calibration(Rawdata, psensor_cfg, gainmap_lut, dccmap_lut,
dccmap_width, dccmap_height, dcc_Sign,pd_offset);
memset(pixelbuf, 0, sizeof(uint16_t)* width * height);
memset(ave_pixelbuf, 0, sizeof(uint16_t)* width * height);
char prename1[20] = "image";
for (int i = 0; i < 3; i++)
{
char temp[20];
char id[5];
int idint = i + 1;
strcpy(temp, prename1);
_itoa_s(idint, id, 10);
strcat(temp, id);
strcat(temp, endname);
fp = fopen(temp, "rb");
if (fp == NULL)
{
return false;
}
fread(pixelbuf, 1, height * width * 2, fp);
fclose(fp);
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
uint16_t tempbuf = *(ave_pixelbuf + j*width + i);
*(ave_pixelbuf + j*width + i) = tempbuf + *(pixelbuf + j*width +
i) / 3;
}
}
}
*code = pdaf_dccmap_vertification(ave_pixelbuf, psensor_cfg, curpos,
gainmap_lut, dccmap_lut, *dcc_Sign,pd_offset);
if (ave_pixelbuf != NULL)
{
free(ave_pixelbuf);
ave_pixelbuf = NULL;
}
if (pixelbuf != NULL)
{
free(pixelbuf);
pixelbuf = NULL;
}
if (Rawdata != NULL)
{
free(Rawdata);
Rawdata = NULL;
}
return ret;
}
bool dcc_calc_sharpness(sensor_cfg* psensor_cfg)
{
int height = psensor_cfg->height;
int width = psensor_cfg->width;
int imgnum = 5;
if (psensor_cfg->pd_dual_mode && psensor_cfg->mipi_mix_mode)
{
height = psensor_cfg->height + (psensor_cfg->sensor_type +
1)*psensor_cfg->pd_height;
}
uint16_t *Rawdata = NULL;
Rawdata = (uint16_t*)malloc(width * height * 2 * imgnum);
memset(Rawdata, 0, sizeof(uint16_t)* width * height* imgnum);
uint16_t *pixelbuf = NULL;
pixelbuf = (uint16_t*)malloc(width * height * 2);
memset(pixelbuf, 0, sizeof(uint16_t)* width * height);
FILE *fp = NULL;
char prename[20] = "calimage";
char endname[5] = ".raw";
for (int i = 0; i < imgnum; i++)
{
char temp[20];
char id[5];
int idint = i + 1;
strcpy(temp, prename);
_itoa_s(idint, id, 10);
strcat(temp, id);
strcat(temp, endname);
fp = fopen(temp, "rb");
if (fp == NULL)
{
return false;
}
fread(pixelbuf, 1, height * width * 2, fp);
fclose(fp);
memcpy(Rawdata + i*height * width, pixelbuf, sizeof(uint16_t)*height *
width);
}
bool ret=pdaf_calc_sharpness(Rawdata, imgnum, psensor_cfg);
if (pixelbuf != NULL)
{
free(pixelbuf);
pixelbuf = NULL;
}
if (Rawdata != NULL)
{
free(Rawdata);
Rawdata = NULL;
}
return ret;
}
4.2 Format der paketierten Programmierdaten
Wie in der folgenden Tabelle dargestellt, können Benutzer je nach Bedarf bestimmte Blöcke programmieren. Die Block-ID darf dabei nicht geändert werden. Nach dem Programmieren der benötigten Blöcke muss abschließend 0xff programmiert werden:
| Länge (Byte) | Datenelement | Anmerkung |
|---|---|---|
| 8 | Mark | ROCKCHIP |
| 1 | ID | ID=0,Sensorinformationen |
| 4 | Size | Größe der Blockdaten |
| Blockdaten | ||
| 1 | ID | ID=1,AWB-Kalibrierung |
| 4 | Size | Größe der Blockdaten |
| Blockdaten | ||
| 1 | ID | ID=2,LSC-Kalibrierung |
| 4 | Size | Größe der Blockdaten |
| Blockdaten | ||
| 1 | ID | ID=3,PDAF-Kalibrierung |
| 4 | Size | Größe der Blockdaten |
| Blockdaten | ||
| 1 | ID | ID=4,AF Code |
| 4 | Size | Größe der Blockdaten |
| Blockdaten | ||
| 1 | ID | ID=5,QSC |
| 4 | Size | Größe der Blockdaten |
| Blockdaten | ||
| … | … | … |
| 1 | 0xFF | Endekennung |
Die konkreten Blockinhalte folgen. Mehrbyte-Daten verwenden einheitlich Big-Endian: Das höherwertige Byte wird an der niedrigeren Adresse gespeichert, das niederwertige an der höheren:
| Offsetadresse | Länge (Byte) | Datenelement | Anmerkung |
|---|---|---|---|
| 0x0000 | 8 | Mark | ROCKCHIP |
| 0x0008 | 1 | ID | ID=0,Sensorinformationen |
| 0x0009 | 4 | Size | Size=35 |
| 0x000D | 2 | Version | Version der Sensorinformationen: v1.0.8=0x0108 |
| 0x000F | 1 | Supplier ID | Benutzerdefiniert |
| 0x0010 | 1 | Datum: Jahr | Beispielsweise für 2021 den Wert 21 schreiben |
| 0x0011 | 1 | Datum: Monat | Beispielsweise für Juli den Wert 7 schreiben |
| 0x0012 | 1 | Datum: Tag | Beispielsweise für den 12. den Wert 12 schreiben |
| 0x0013 | 1 | Sensor ID | Benutzerdefiniert |
| 0x0014 | 1 | Lens ID | Benutzerdefiniert |
| 0x0015 | 1 | VCM ID | Benutzerdefiniert |
| 0x0016 | 1 | Driver ID | Benutzerdefiniert |
| 0x0017 | 4 | Module ID | Benutzerdefiniert |
| 0x001B | 1 | mirror/flip | Bit[7:4]:Mirror Bit[3:0]:Flip ON: 1, OFF: 0 |
| 0x001C | 1 | Full Width H | Höherwertiges Byte der vollen Breite |
| 0x001D | 1 | Full Width L | Niederwertiges Byte der vollen Breite |
| 0x001E | 1 | Full Height H | Höherwertiges Byte der vollen Höhe |
| 0x001F | 1 | Full Height L | Niederwertiges Byte der vollen Höhe |
| 0x0020 | 15 | Reserved | Reserved=0xff |
| 0x002F | 1 | Checksum | Prüfsumme der Sensorinformationen Sum(0x0009~0x002E) % 255+1 |
| Offsetadresse | Länge (Byte) | Datenelement | Anmerkung |
|---|---|---|---|
| 0x0000 | 1 | ID | ID=1,AWB-Kalibrierung |
| 0x0001 | 4 | Size | Size=43 |
| 0x0005 | 2 | Version | AWB Version: v1.0.9=0x0109 |
| 0x0007 | 1 | R/G_H | Höherwertiges Byte des aktuellen R/G-Werts |
| 0x0008 | 1 | R/G_L | Niederwertiges Byte des aktuellen R/G-Werts |
| 0x0009 | 1 | B/G_H | Höherwertiges Byte des aktuellen B/G-Werts |
| 0x000A | 1 | B/G_L | Niederwertiges Byte des aktuellen B/G-Werts |
| 0x000B | 1 | Gr/Gb_H | Höherwertiges Byte des aktuellen Gr/Gb-Werts |
| 0x000C | 1 | Gr/Gb_L | Niederwertiges Byte des aktuellen Gr/Gb-Werts |
| 0x000D | 1 | R/G_H | Höherwertiges Byte des Golden-Referenzwerts R/G |
| 0x000E | 1 | R/G_L | Niederwertiges Byte des Golden-Referenzwerts R/G |
| 0x000F | 1 | B/G_H | Höherwertiges Byte des Golden-Referenzwerts B/G |
| 0x0010 | 1 | B/G_L | Niederwertiges Byte des Golden-Referenzwerts B/G |
| 0x0011 | 1 | Gr/Gb_H | Höherwertiges Byte des Golden-Referenzwerts Gr/Gb |
| 0x0012 | 1 | Gr/Gb_L | Niederwertiges Byte des Golden-Referenzwerts Gr/Gb |
| 0x0013 | 28 | Reserved | Reserved=0xff |
| 0x002F | 1 | Checksum | Prüfsumme der AWB-Kalibrierung Sum(0x0001~0x002E) % 255+1 |
| Offsetadresse | Länge (Byte) | Datenelement | Anmerkung |
|---|---|---|---|
| 0x0000 | 1 | ID | ID=2,LSC-Kalibrierung |
| 0x0001 | 4 | Size | Size=2347 |
| 0x0005 | 2 | Version | LSC Version: v1.0.b=0x010b |
| 0x0007 | 2312 | LSC- Kalibrierungs- daten |
17x17x4-Matrix mit Festkommaskalierung 1024, ungepackt, Big-Endian; gespeicherte Kanalreihenfolge R, Gr, Gb, B |
| 0x090F | 32 | Reserved | Reserved=0xff |
| 0x092F | 1 | Checksum | Prüfsumme der LSC-Kalibrierung Sum(0x0001~0x092E) % 255+1 |
| Offsetadresse | Länge (Byte) | Datenelement | Anmerkung |
|---|---|---|---|
| 0x0000 | 1 | ID | ID=3,PDAF-Kalibrierung |
| 0x0001 | 4 | Size | Size=2603 |
| 0x0005 | 2 | Version | PDAF Version: v1.1.12=0x011c |
| 0x0007 | 1 | Gainmap_width | Gain-Map-Größe, ermittelt mit pdaf_gainmap_calibration() |
| 0x0008 | 1 | Gainmap_height | Gain-Map-Größe, ermittelt mit pdaf_gainmap_calibration() |
| 0x0009 | 2048 | Gainmap | Tatsächliche Größe=Gainmap_width* Gainmap_height*2, Big-Endian, Standardwert: 0xff |
| 0x0809 | 1 | Checksum | Gain-Map-Prüfsumme Sum(0x0007~0x00808) % 255+1 |
| 0x080A | 1 | mode value | DCC-Map-Anpassungsmodus (Standard dieser Version: 1), entsprechend DCC_CALIBRATE_MODE in der PD-INI-Konfiguration |
| 0x080B | 1 | direction | dccSign, ermittelt mit pdaf_dccmap_calibration() 0: negativ 1: positiv |
| 0x080C | 1 | DCCmap_width | DCC-Map-Größe, ermittelt mit pdaf_dccmap_calibration() |
| 0x080D | 1 | DCCmap_height | DCC-Map-Größe, ermittelt mit pdaf_dccmap_calibration() |
| 0x080E | 512 | Dccmap | Tatsächliche Größe=DCCmap_width* DCCmap_height*2, Big-Endian, Standardwert: 0xff |
| 0x0A0E | 1 | Checksum | DCC-Map-Prüfsumme Sum(0x080A~0x0A0D) % 255+1 |
| 0x0A0F | 2 | pd_offset | flag(1)sign(1)reserve(2)integer(4)8fix_decimals(8) ,flag=0:Kalibrierung sign=1:positiv |
| 0x0A11 | 30 | Reserved | Reserved=0xff |
| 0x0A2F | 1 | Checksum | Prüfsumme der PDAF-Kalibrierung Sum(0x0001~0x0A2E) % 255+1 |
| Offsetadresse | Länge (Byte) | Datenelement | Anmerkung |
|---|---|---|---|
| 0x0000 | 1 | ID | ID=4,AF Code |
| 0x0001 | 4 | Size | Size=27 |
| 0x0005 | 2 | Version | AF Version: v1.0.9=0x0109 |
| 0x0007 | 1 | AF Infinite H | Höherwertiger Anteil des AF-Fernfokus-Codewerts |
| 0x0008 | 1 | AF Infinite L | Niederwertiger Anteil des AF-Fernfokus-Codewerts |
| 0x0009 | 1 | AF Macro H | Höherwertiger Anteil des AF-Nahfokus-Codewerts |
| 0x000A | 1 | AF Macro L | Niederwertiger Anteil des AF-Nahfokus-Codewerts |
| 0x000B | 1 | AF_Medium H | Höherwertiger Anteil des mittleren AF-Fokus-Codewerts |
| 0x000C | 1 | AF_Medium L | Niederwertiger Anteil des mittleren AF-Fokus-Codewerts |
| 0x000D | 18 | Reserved | Reserved=0xff |
| 0x001F | 1 | Checksum | AF-Code-Prüfsumme Sum(0x0001~0x001E) % 255+1 |
| Offsetadresse | Länge (Byte) | Datenelemente | Anmerkung |
|---|---|---|---|
| 0x0000 | 1 | ID | ID=5,QSC |
| 0x0001 | 4 | Size | Size=4107 |
| 0x0005 | 2 | Version | QSC Version: v1.0.0=0x0100 |
| 0x0007 | 2 | QSC Size | QSC-Größe, Big-Endian |
| 0x0009 | 4096 | Data | Die tatsächliche Schreibgröße der QSC-Daten richtet sich nach der QSC-Größe; der Standardwert ist 0xff |
| 0x1009 | 6 | Reserved | Reserved=0xff |
| 0x100F | 1 | Checksum | QSC-Prüfsumme Sum(0x0001~0x100E) % 255+1 |
