Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Und ein weiteres Erkennungsthema... (https://www.delphipraxis.net/137780-und-ein-weiteres-erkennungsthema.html)

LDericher 28. Jul 2009 15:59


Und ein weiteres Erkennungsthema...
 
Hallo DP, mal wieder,

Weiß nicht, ob und wenn ja wie oft das Thema hier schon durchgenommen wurde...
Aber egal, SuFu war hier nicht wirklich ergiebig, also:

Ich würde gern Gesichter erkennen können! Oder vielmehr meinem Computer selbiges beibringen :stupid:

Dazu hab ich mir bereits etwas sehr Nettes gebastelt, was auch schon erstaunlich gut funktioniert, doch dazu später mehr.
Jetzt arbeite ich daran, das Ganze mit meiner Webcam zu kombinieren. Mein Problem ist nun, dass ich meinen Kopf sehr genau an dieselbe Stelle halten muss, an der er "gelernt" wurde. Sprich, wenn ich ihn rechts relativ groß eingegeben habe, muss ich ihn auch wieder rechts recht nah hinhalten um ein Ergebnis zu bekommen. Wundert mich ehrlich gesagt auch nur wenig.

Also hätte ich jetzt gern das Rechteck, in dem sich mein kompletter Kopf befindet, automatisch erkannt, damit ich wirklich nur meinen Kopf dort eingebe.

Die unvermeidliche Frage sei nun gestellt: "Wie gehe ich da ran"?

Danke schonmal,

Der LDer.

jfheins 28. Jul 2009 16:09

Re: Und ein weiteres Erkennungsthema...
 
Also du hast schon was, was dein Gesicht identifizieren kann, und möchtest einen Algo, der sagt wo es sein könnte?

Für diese Groberkennung könnte es ja schon reichen, wenn du nach den schwarzen Punkten (aka Augen) suchst und guckst ob da ein heller bereich (aka Gesicht) drumherum ist. (Größe des nötigen Bereichs hängt vom Augenabstand ab) Falls das der Fall ist => Bereich ausschneiden und normieren (drehen und skalieren) und dem anderen Algo geben. Weitermachen, bis alle Gesichter gefunden sind, oder keine möglichen Positionen mehr gefunden wurden.
Beim Augenabstand solltest du noch Grenzen einbauen, nach oben und nach unten.
Dieser Algo ist nicht besonders gut (produziert viele false positives) aber dafür schnell. Und für Genauigkeit haste ja schon was, wenn ich dich richtig verstanden hab' :)

LDericher 28. Jul 2009 16:23

Re: Und ein weiteres Erkennungsthema...
 
Zitat:

Zitat von jfheins
guckst ob da ein heller bereich (aka Gesicht) drumherum ist

Informatikrassismus?

Nein, was macht man bei Dunkelhäutigen? Ich habe schwarze Bekannte o_O ...

mfg LDer

jfheins 28. Jul 2009 16:40

Re: Und ein weiteres Erkennungsthema...
 
Oh ähhh ... zu kurz gedacht :oops: :wall:

Wenn die Auflösung gut genug ist, könnte man nach dem weißen im Auge suchen, ansonsten vll. die Person bitten zu lächeln wegen den hellen Zähnen :stupid:

Ansonsten fällt mir nicht mehr viel ein, was universell ist :?

LDericher 28. Jul 2009 18:04

Re: Und ein weiteres Erkennungsthema...
 
Irgendwelche Ansätze, Augen zu finden?

Habe mal versucht das ganze schwarz/weiß zu setzen (erstmal quick&dirty), aber es soll bei jeder Belichtung funktionieren und je nachdem wie der schwellwert ist (hier 127) ergibt sich ein vollkommen anderes Bild...
Kann man irgendwie die "Durchschnittshelligket" des Bildes berechnen, um den perfekten Schwellwert rauszukriegen?
... Langsam wächst die Aufgabe... Ich setz mich mal wieder dran x)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  X,
  Y:integer;
  R,
  G,
  B:Byte;
begin
for Y:=0 to Image1.Picture.Height do
   for X:=0 to Image1.Picture.Width do
      begin
      R:=GetRValue(Image1.Picture.Bitmap.Canvas.Pixels[X, Y]);
      G:=GetGValue(Image1.Picture.Bitmap.Canvas.Pixels[X, Y]);
      B:=GetBValue(Image1.Picture.Bitmap.Canvas.Pixels[X, Y]);
      if((R+G+B)div 3 > 127)
        then Image1.Picture.Bitmap.Canvas.Pixels[X, Y]:=clWhite
        else Image1.Picture.Bitmap.Canvas.Pixels[X, Y]:=clBlack;
      end;
end;
Gruß vom LDer.

brechi 28. Jul 2009 18:11

Re: Und ein weiteres Erkennungsthema...
 
vielleicht hilft das weiter:
http://opencv.willowgarage.com/wiki/

LDericher 28. Jul 2009 18:24

Re: Und ein weiteres Erkennungsthema...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo brechi,

Wenn ich mich einarbeiten würde, würds mir bestimmt helfen... aber ich will auch kein Haus bauen, indem ich eins kaufe/miete/runterlade...
Also ich will keine fertige Lösung haben^^

Naja, bin mittlerweile so weit mit meinen Graustufen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  X,
  Y:integer;
  R,
  G,
  B,
  Hell:Byte;
  DHell:int64;
begin
DHell:=0;
for Y:=0 to Image1.Picture.Height do
   for X:=0 to Image1.Picture.Width do
      begin
      R:=GetRValue(Image1.Picture.Bitmap.Canvas.Pixels[X, Y]);
      G:=GetGValue(Image1.Picture.Bitmap.Canvas.Pixels[X, Y]);
      B:=GetBValue(Image1.Picture.Bitmap.Canvas.Pixels[X, Y]);
      Hell:=(R+G+B)div 3;
      Image1.Picture.Bitmap.Canvas.Pixels[X, Y]:=Hell;
      DHell:=DHell+Hell;
      end;
DHell:=DHell div (Image1.Picture.Height*Image1.Picture.Width);
for Y:=0 to Image1.Picture.Height do
   for X:=0 to Image1.Picture.Width do
      begin
      R:=Image1.Picture.Bitmap.Canvas.Pixels[X, Y];
      if(R > DHell)
        then Image1.Picture.Bitmap.Canvas.Pixels[X, Y]:=clWhite
        else Image1.Picture.Bitmap.Canvas.Pixels[X, Y]:=clBlack;
      end;
end;
Nun, Fraaa~gen:
1. Wie optimiert man das? Da war mal iiirrrggeeennndddwwwaaannnnnnn was mit ScanLine oder so... ähnlich... Wie geht des nochmaaa~l? Kann ich mir nicht sowieso irgendwie eine Zeile davon sparen?
2. Schießt ein Bild von euch und lasst den Code drüberrennen... Wie würdet ihr jetzt ein Programm nach euren Augen suchen lassen? Alternativ bietet sich das Bild im Anhang an.

So, hoffe mal wieder auf Antworten!

Der LDer.

LDericher 28. Jul 2009 19:01

Re: Und ein weiteres Erkennungsthema...
 
Habe hier mal was gefunden und zurechtgeschnippselt:

Delphi-Quellcode:
procedure DoSomething(Input:TBitmap);
type
  PixArray = array [1..3] of Byte;
var
  P: ^PixArray;
  X,
  Y:integer;
  Hell:Byte;
  DHell:int64;
const
  paWhite:PixArray=(255, 255, 255);
  paBlack:PixArray=(0, 0, 0);
begin
DHell:=0;    
for Y:=0 to Input.Height-1 do
   begin
   P:= Input.ScanLine[Y];
   for X:=0 to Input.Width-1 do
      begin
      Hell:=(P^[1]+P^[2]+P^[3])div 3;
      P^[1]:=Hell;
      P^[2]:=Hell;
      P^[3]:=Hell;
      DHell:=DHell+Hell;
      Inc(P);
      end;
   end;
for Y:=0 to Input.Height-1 do
   begin
   P:= Input.ScanLine[Y];
   for X:=0 to Input.Width-1 do
      begin
      if(P^[1] > DHell)
        then P^:=paWhite
        else P^:=paBlack;
      Inc(P);
      end;
   end;
end;
Es tut sich nix... warum?

LDer.

Delphi-Quellcode:
Image1.Repaint;
Hilft manchmal... auch hier. Ergebnis: etwa 1000-fache Geschwindigkeit, wooohoooo! ;)

LDericher 29. Jul 2009 10:54

Re: Und ein weiteres Erkennungsthema...
 
Ich markiere hier mal als gelöst, mein Problem hat sich mal wieder verändert.

Neues Topic wird geöffnet: "Schwarz-Weiß-Bildanalyse"

mfg LDer.

grizzly 29. Jul 2009 14:01

Re: Und ein weiteres Erkennungsthema...
 
Ich weiß, ist gelöst.

Aber zum Erkennen der Augen habe ich vor einiger Zeit von einem interessanten Ansatz gelesen: Dort wurde auch in einem laufenden Video nach dem Gesicht und den Augen gesucht. Und um die Augen zu finden wurde einfach auf's Zwinkern gewartet. Gibt im Differenzbild zwischen zwei Video-Frames scheinbar ein schönes Signal...

Wollt' ich nur noch loswerden.

Gruß
Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz