Auswertung der verschiedenen Pixel eines aufgenommenen Bildes.

  • Antworten:8
Henrik Martens
  • Forum-Beiträge: 607

15.12.2015, 12:15:29 via Website

Hallo Zusammen,

da ich relativ neu in der Android-Programmierung bin (VisualBasic, Java und C++ schon seit einigen Jahren) sprudel ich natürlich vor Ideen, welche ich umsetzen will. Teilweise natürlich auch, weil ich denke, dass Leute eine App kaufen könnten.

In diesem Fall geht es allerdings um eine App, welche ich aus Spaß, bzw. eigenem Interesse, programmieren möchte.

Es geht hierbei darum, ein Foto von einer "Scheibe" (Schieß-Sport) zu machen, und anschließend auszuwerten, wo die Schüsse liegen. Müsste ja möglich sein, da die einzelnen "Zähler" optisch getrennt sind, die Einschusslöcher könnte man ja als Abweichungen auswerten.

Nun meine eigentliche Frage: Wie kann ich die Pixel, oder einzelne Bereiche, eines Bildes analysieren?

Ich hoffe, damit hat schon einmal jemand Erfahrungen gemacht.

Antworten
Haakon T.
  • Forum-Beiträge: 375

15.12.2015, 13:50:36 via Website

Henrik Martens

Nun meine eigentliche Frage: Wie kann ich die Pixel, oder einzelne Bereiche, eines Bildes analysieren?

Dafür musst einen Algorithmus entwickeln. Hilfreich ist ein Informatikstudium mit Vertiefung in Bildverstehen/analyse/Mustererkennung.

Da ich auch aus dem Schießsport komme: Selbst die Koreaner haben so etwas nicht.

Antworten
Henrik Martens
  • Forum-Beiträge: 607

15.12.2015, 14:17:20 via Website

Eine Auswertung, wo in einem Bild sich der Spiegel befindet, und wo der / oder die Schüsse liegen, muss doch aber möglich sein.

Klar aufwendig mit einem großen Algorithmus, aber im Prinzip muss ich ja nur die Pixel auswerten, oder?
Dann wäre mir schon mal viel geholfen

Antworten
Henrik Martens
  • Forum-Beiträge: 607

16.12.2015, 09:50:47 via Website

Ich habe nun, weil ich mich einfach mal nicht abringen lassen will, angefangen. Das Grundgerüst der App steht, nur der LivePreview funktioniert noch nicht, aber das sollte ja das kleinste Problem sein.

In der Zwischenzeit habe ich mir schon einmal Gedanken gemacht, wie eine Auswertung funktionieren könnte.

  1. Aufnahme des Bildes
  2. Umwandeln des Bildes in schwarz/weiß
  3. Invertieren der Farben des Bildes
  4. Erkennen der äußersten Ringabgrezung
  5. Beschneiden des Bildes, sodass nur noch der relevante Bereich vorhanden ist
  6. runter-skalieren aus eine kleinere Pixelanzahl (optional, um evtl. Performance-Probleme zu beheben)
  7. Lokalisieren des Mittelpunktes (10er), sollte dieser von einem Schuss "verdeckt", also nicht mehr vorhanden, sein, peilen der 10 anhand der umleigenden Ringe, und einförben
  8. Einfärben des Schusses (mit einer Art "Fill-Tool"), da ja sowohl Einschussloch, als auch die Ringemarkierungen rein-weiß sein sollten, wird der entsprechende Ring auch markiert.
  9. Zählen, wie viele Ringe der Schuss vom Mittelpunkt entfernt ist.

Sollte doch, wenn auch sehr scher, aufwendig und Ressourcen-Fordernd, möglich sein.

Punkt 1. - 3. sollten ohne Probleme machbar sein. Eventuell mit einer externen Lib, wahrscheinlich aber auch ohne.
Für Punkt 4 benötige ich eine Lib, welche Formen und Farben erkennt. Technisch möglich, müsste ich also, zur Not, selbst schreiben. Hat aber bestimmt schon einmal jemand getan.
5. sollte wieder ohne Probleme möglich sein, genau wie 6.
Für 7. - 9. käme dann wieder die Lib zum Einsatz

Dies nur als kleiner Zwischenstand, eventuell habt ihr ja noch Ideen, wie man den Prozess vereinfachen oder präzisieren könnte.

Euer Henrik

Antworten
Henrik Martens
  • Forum-Beiträge: 607

28.12.2015, 11:49:22 via Website

Hallo Leute,

heute ein neuer Bericht meiner Arbeit.

Das Bild wird aufgenommen, verkleinert, als Schwarz-Weiß erstellt und dann invertiert. Außerdem wird der Schuss bereits rot eingefärbt.

Das ganze sieht nun so aus:

image

Nun will ich, um die spätere Auswertung zu vereinfachen, möchte ich das Bild auf den Bereich der Scheibe begrenzen. Meine Idee war, mit for-Schleifen, das Bild von jeder Seite duchzugehen, den jeweils ersten weißen Pixel zu speichern, und dann umzurchenen, wie das Bild beschnitten werden muss.

Problem ist nun, dass ja am Rand, durchaus (wie auch in meinem Fall) schon weiße Pixel auftauchen können. Sowohl durch Markierungen als auch durch Hintergrund.

Habt Ihr eine Idee, wie man das besser lösen kann? Z.B. Einfärben oder ignorieren der "falschen" weißen Pixel?
Problem ist ja, dass jede fotografierte Scheibe anders aussieht.

Euer Henrik

Antworten
Fabian Simon
  • Forum-Beiträge: 359

28.12.2015, 15:30:02 via Website

Vielleicht machst du es umgekehrt...
Nimmst die mitte des Bildes die sich ja irgendwo auf der Scheibe befinden muss und scannst solange deine umliegende Umgebung bis du eine höhere Dichte an schwarzvorkommenden Pixel findest.
Funktioniert natürlich nur dann, wenn du davon ausgehen kannst das der Mittelpunkt des Bildes sich automatisch irgendwo auf der Scheibe befindet.

Antworten
Henrik Martens
  • Forum-Beiträge: 607

28.12.2015, 15:35:49 via Website

Das wäre eine Idee, allerdings kommen (von der Mitte aus gesehen) ja das öfteren schon schwarze Pixel.

Antworten
Fabian Simon
  • Forum-Beiträge: 359

29.12.2015, 10:30:01 via Website

Sicher aber nicht in der Dichte . Du musst ja nur schauen wie oft schwarze Pixel aufeinander folgen und ab der menge X definierst du es als rand...

Antworten
Markus B.
  • Forum-Beiträge: 636

29.12.2015, 13:31:45 via Website

Hi,
ich würde noch an folgendes denken:

Aktuell gehst du von einem "optimalem" Bild aus. Wenn jmd. deine App nutzt werden z. B. folgende Dinge eintreten:

  1. Unterschiedliche Lichtverhältnisse
  2. Unterschiedliche Hintergründe (Zielscheibe ist nicht schwarz/weiß,
    die Zielscheibe liegt auf einer Tischdeck, Objekte (Stifte ...)
    werden mit abfotografiert.)

Ich weiß nicht genau wie du das Bild in ein schwarz / weiß Bild konvertierst oder das Invertieren der Farben machen willst. Dafür würde ich vorschlagen du schaust dir mal opencv an.
Damit kannst du die eben genannten Aufgaben erledigen und auch die Zielscheibe ermitteln:

  1. Schwarz / Weiß Bild erzeugen
  2. Edge Detection
  3. Object Detection (Kreis), von denen du einfach den größten im Bild nimmst. Ist dann
    ziemlich sicher die ganze Zielscheibe.
  4. Auf der Zielscheibe weiterarbeiten und somit die Umgebung ausblenden
  5. Evtl. noch mal Edge Detection. Die kleinsten
    Kreise suchen, was dann hoffentlich die Treffer sind.

Ist aber alles nur als grobe Skizze zusehen :)

Gruß,
Markus

Antworten