Forum: Mikrocontroller und Digitale Elektronik Grow R503 Fingerprintsensor Imagedaten auslesen


von J. S. (jojos)


Angehängte Dateien:

Lesenswert?

Hat das hier schon mal jemand hinbekommen? Also das Auslesen selber ist 
dokumentiert, man schickt ein Kommando zum Fingerabdruck speichern 
(intern), dann eines zum Upload und dann bekomme ich 18270 Byte Daten. 
Die Doku ist etwas dünn, in der neuesten die ich gefunden habe (in der 
Dropbox von Grow) steht das ein Byte 2x 4 Bit Pixel enthält, das eine 
für die aktuelle Zeile und das andere für die nächste Zeile.
Die Daten packe ich in ein Bitmapfile, ich sehe aber nur Pixelsalat, 
bzw. in etwa schon einen Fingerprint, aber mit Versatz. Auch in der Demo 
App des Herstellers wird das für diesen Sensor nicht richtig angezeigt. 
Enroll/Search funktioniert, nur eben das Image anzeigen nicht richtig.
Das Bild ist im Anhang, die Kreise habe ich reingemalt um meinen 
Stinkefinger nicht zu zeigen. Da scheint auch noch was mit der 
Farbpalette faul zu sein. Ich erweitere die 4 Bit Pixel auf 8 Bit und 
habe eine LUT mit 256 Einträgen. In einem Vergleichsbild von der Demo SW 
sehen Header und LUT gleich aus, da passt das Graubild aber.

Und noch ein paar Infos die der Sensor verrät:
1
Status  : 0x0
2
Sys ID  : 0x0
3
Capacity: 200
4
Security level: 3
5
Device address: -1
6
Packet len: 128
7
Baud rate: 57600
8
9
Module Type: R5xx
10
Hardware Version: 01.01
11
Module Batch Number: 1111
12
Module Serial Number: 20060402
13
Database size: 200
14
Template size: 1536
15
Sensor Type: GR192RGB
16
Sensor width/height : 192 192
17
starting network
18
network is up, IP:  192.168.100.134
19
Server is listening at http://192.168.100.134:8080
20
TFTPServer starting...
21
genImage result: 0x0
22
  image size: 18720
23
uploadImage result: 0x0
24
 block count: 144

: Bearbeitet durch User
von Purzel H. (hacky)


Lesenswert?

Gibt's allenfalls ein Datenblatt, eine Application Note, Support ?

Ein byte enthaelt 2 x 4 pixel. Wie hast du die dargestellt ?

von J. S. (jojos)


Lesenswert?

Es gibt eine Anleitung in der schon einiges drinsteht, zum Format eben 
nur 2x 4 Bit, nichts von Komprimierung.
Ich speichere das konvertierte Array  in eine Bitmap Datei auf SD Karte, 
kann diese über eine Webseite anzeigen oder per TFTP abholen.
Der Sensor liefert immer die 18270 Byte auf eine Anfrage zum Upload.

Doku ist China typisch in Dropbox:
https://www.dropbox.com/sh/epucei8lmoz7xpp/AAAmon04b1DiSOeh1q4nAhzAa?e=1&spm=a2g0o.detail.1000023.1.676claGNlaGNb1&dl=0

https://www.dropbox.com/sh/pznvlzx8qx5nfr3/AABpzhSyjqH0qWNYgMvxqAA9a?e=1&spm=a2g0s.imconversation.0.0.109b3e5fckU9p0&dl=0

Auch in den Sourcecodes von Grow konnte ich nicht finden, der relevante 
Interface Teil ist in einer DLL ohne Quellcode.

1
When uploading or downloading images through the UART port, only the high four bits of pixel
2
bytes are used to speed up the transmission, that is, use gray level 16, two pixels are combined into one
3
byte. (The high four bits are a pixel, the low four bits are a pixel in the next adjacent column of the same
4
row, that is, two pixels are combined into one byte and transmitted)
5
Since the image has 16 gray levels, when it is uploaded to PC for display (corresponding to BMP
6
format), the gray level should be extended (256 gray levels, that is, 8bit bitmap format)

: Bearbeitet durch User
von Joachim S. (oyo)


Lesenswert?

J. S. schrieb:
> Die Doku ist etwas dünn, in der neuesten die ich gefunden habe (in der
> Dropbox von Grow) steht das ein Byte 2x 4 Bit Pixel enthält, das eine
> für die aktuelle Zeile und das andere für die nächste Zeile.

J. S. schrieb:
> two pixels are combined into one
> byte. (The high four bits are a pixel, the low four bits are a pixel in
> the next adjacent column of the same
> row

Beim Lesen ist mir aufgefallen, dass Du im Eröffnungsposting geschrieben 
hast, in einem Byte wären zwei Pixel benachbarter Zeilen, die englische 
Dokumentation im zweiten Posting hingegen von zwei Pixeln benachbarter 
Spalten spricht.

Hast Du beim Lesen der Doku eventuell einfach versehentlich "column" mit 
"Zeile" statt mit "Spalte" übersetzt und das aufgrund dieses kleinen 
Irrtums dann falsch implementiert?

von J. S. (jojos)


Lesenswert?

Ich hatte im Code zuerst zwei Nachbarpixel in einer Zeile gemacht weil 
dieser Hinweis in der Doku erst in neueren Revisionen hinzugekommen ist. 
Danach habe ich es geändert, dafür ist der twoLineBuffer im Code.  Sieht 
aber immer noch nicht passend aus.
Auch die RGB LED ist erst in der neuen Doku drin.

von Joachim S. (oyo)


Lesenswert?

J. S. schrieb:
> Ich hatte im Code zuerst zwei Nachbarpixel in einer Zeile gemacht weil
> dieser Hinweis in der Doku erst in neueren Revisionen hinzugekommen ist.
> Danach habe ich es geändert, dafür ist der twoLineBuffer im Code.

Das habe ich ehrlich gesagt nicht 100%ig verstanden, aber egal.

Ich habe jetzt auch mal den Code überflogen und meiner Interpretation 
nach behandelt Dein Code die Daten in der Tat so, als würde ein Byte der 
Rohdaten die Pixel zweier aufeinanderfolgender Zeilen in der selben 
Spalte enthalten (daher ja auch die Verwendung eines "twoLineBuffer").
Laut dem besagten Hinweis in der Doku sind es aber (wie üblich) die 
Pixel zweier aufeinanderfolgenden Spalten in der selben Zeile.

Wenn Du das vorher genau anders herum implementiert hattest, das Bild 
aber trotzdem fehlerhaft war, dann steckt eventuell zusätzlich noch ein 
anderer kleiner Fehler im Code - aber meiner Meinung nach hat der Code 
zumindest an dieser Stelle aktuell einen Fehler.

von J. S. (jojos)


Angehängte Dateien:

Lesenswert?

Joachim S. schrieb:
> aber meiner Meinung nach hat der Code
> zumindest an dieser Stelle aktuell einen Fehler.

Danke fürs aufpassen, du hattest Recht, war zu spät gestern und da ist 
das so eine Sache mit den Zeilen und Spalten. War eine lange Geburt, 
aber jetzt passt es.

Da war aber noch ein grober Schnitzer drin. Ich habe die Adafruit Lib 
als Basis genommen und das fehlende Kommando zum Auslesen eingebaut. Da 
wird die gelesene Paketlänge aber blöderweise als Bruttowert 
eingetragen, mit der Länge der CRC (die in der Lib auch nicht 
ausgewertet wird). Nach Korrektur um -2 pro Packet auf Nettolänge passt 
die Gesamtlänge jetzt auch, es kommmen 18432 Byte, entspricht 192 * 
192/2,
1
  // image data 4 Bit -> 8 Bit
2
  for(int y=0; y < 192; y++) {
3
    for(int x=0; x < 192/2; x++) {
4
      uint8_t val1 = (imageBuffer[x + y*96] >> 4) * 16;
5
      uint8_t val2 = (imageBuffer[x + y*96] & 0xf) * 16;
6
      lineBuffer[2*x] = val1;
7
      lineBuffer[2*x + 1] = val2;
8
    }
9
    imageFile.write(lineBuffer, sizeof(lineBuffer));
10
  }

Bleibt noch eine Unschärfe mit der Farbpalette, aber das finde ich auch 
noch.

hier ist noch der Teil zum Image lesen, da ist noch Debugzeug drin das 
raus muss. Und die Prüfung der Länge des ImageBuffer fehlt noch. 
Eventuell mache ich noch einen PR dazu.
1
DigitalOut  testPin1(PA_6);
2
DigitalOut  testPin2(PA_4);
3
4
uint8_t Adafruit_Fingerprint::uploadImage(uint8_t *imageBuffer) {
5
    GET_CMD_PACKET(FINGERPRINT_UP_IMG);
6
7
    uint8_t result = packet.data[0];
8
    if (result == FINGERPRINT_OK) {
9
      int length = 0;
10
      packetCount = 0;
11
      
12
      testPin2 = 1;
13
      
14
      packet.type = 0x02;
15
      while (packet.type == 0x02) {
16
          testPin1 = 1;
17
18
          result = getStructuredPacket(&packet);
19
          if (result != FINGERPRINT_OK) 
20
            break;
21
          if (imageBuffer)
22
            memcpy(&imageBuffer[length], packet.data, packet.length-2);
23
          length += packet.length-2;
24
          packetCount++;
25
          
26
          testPin1 = 0;
27
      }
28
      testPin2 = 0;
29
30
      printf("  image size: %d\n", length);
31
    }
32
33
    return result;
34
}

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.