Berechnen ob Punkt ungefähr in Mitte von Rechteck ist

jb_alvarado

Lt. Junior Grade
Registriert
Sep. 2015
Beiträge
492
Hallo Allerseits,
zum Hintergrund:

Ich programmiere eine Funktion mit der ich in Videos, per openCV (DNN), nach Gesichtern suchen kann. Wenn ein Gesicht gefunden wird, bekomme ich die Koordinaten des Rechtecks um das Gesicht, sowie der Augen, Nase und Mundwinkel.

Da die Gesichtserkennung auch Profilansichten etc. erkennt, möchte ich die Treffer weiter eingrenzen und nur Gesichter finden, die ungefähr frontal in die Kamera schauen. Die Genauigkeit sollte zwischen 80-90% liegen, muss das dann noch testen, wie genau es wirklich sein soll.

Um das zu bewerkstelligen dachte ich mir, ich nehme einfach die Nase und berechne wie weit sie vom Mittelpunkt des (Gesichts-) Rechtecks entfernt ist. Alles was näher als 10-20% ist, lasse ich mir ausgeben.

Programmiersprache ist in dem Fall nicht so wichtig, ist aber Rust.

Da meine Schul-Mathe-Zeit schon lange zurück liegt, hänge ich gerade an der Formel. Könnt ihr mir hierbei helfen und sagen wie ich das berechnen kann?
 
Du weißt doch wie breit das Rechteck ist. Die Hälfte der Breite ist die Mitte. Bei der Höhe das Gleiche.

Ist das Gesicht 10cm breit, wäre die Mitte bei 5cm +/- 1cm
 
Die Mitte wäre x+width/2 und y+height/2
Und einen ungefähren Bereich dann eben nochmal mit +- soundsoviel Pixel
 
Von zwei nicht gegenüberliegenden Seiten des Rechtecks im Rechten Winkel einen Vektor zur Nasenmitte zeichnen. Befinden sich beide Vektoren im eingegrenzten Mittelbereich von Höhe/Breite des Rechtecks = Valid.
Komplizierte Mathematik braucht man dazu nicht...
 
TorenAltair schrieb:
Die Mitte wäre x+width/2 und y+height/2
Was ist dann x?
Du meinst wohl eher x = width/2 und y = height/2

@Tornhoof Nein? Oder ist ein Rechteck eine unsymmetrische Figur? Also ja. Im Prinzip schon. Und mit den Polygonen würde das sogar Sinn machen. Das macht das ganze aber deutlich komplexer.
 
@kachiri x und y ist die obere linke Ecke des Rechtecks, da das ja irgendwo im Bild sein kann.
 
Wenn da eine Gesichtserkennung läuft, kann man nicht einfach hingehen und z.B. Bilder aussortieren, auf denen nur ein Auge erkennbar ist?
 
@Tornhoof und @ghecko haben auf jeden fall die besseren ansätze, @SaxnPaule und @TorenAltair lösungen gehen davon aus, dass es sich um achsenparallel rechtecke handelt.
streng genommen wurde hier nur die frage behandelt, wie man den mittelpunkt findet und nicht den bereich um den mittelpunkt. des weiteren stellt sich mir die frage inwieweit die nase tatsächlich mit dem mittelpunkt des gesichts, bzw. dessen bounding box, übereinstimmt
 
  • Gefällt mir
Reaktionen: jb_alvarado
OK... nur ein Ohr...
 
@Abudinka Rechteck: Viereck mit vier rechtwinkligen Ecken und je zwei sich gegenüberliegenden parallen und gleich langen Seiten.

Ansonsten wäre es ein Trapez oder Parallelogramm.
 
nach kurzer überlegung würde ich wahrscheinlich einen kreis oder ellipse um die nase mit radius 60% der seitenlängen bauen und schauen ob dieser komplett innerhalb des rechtecks ist

@SaxnPaule achsenparallel in bezug zum bild, nicht jeder hält seinen kopf immer gerade
 
@Abudinka Er/Sie bekommt doch nach eigener Aussage die Koordinaten des Rechteckes und damit auch die Abmessungen. Somit ist doch der Bezug vollkommen irrelevant und man kann das Rechteck für sich betrachten.

Zur Not halt den Schnittpunkt der diagonalen Richtungsvektoren nehmen. Ist halt fraglich, ob man es so weit treiben muss.
 
@Abudinka Wenn das dazu käme, dann eben mit einer Winkelfunktion erst normalisieren.

Edit: oder halt in Pseudocode:
wenn (nase.x > (x+breite/2)-breite*0.1) und (nase.x < (x+breite/2)+breite*0.1) und (nase.y > (y+hoehe/2)-hoehe*0.1) und (nase.y < (y+hoehe/2)+hoehe*0.1) dann nase.treffer=wahr
 
  • Gefällt mir
Reaktionen: jb_alvarado
SaxnPaule schrieb:
@Abudinka Er/Sie bekommt doch nach eigener Aussage die Koordinaten des Rechteckes. Somit ist doch der Bezug vollkommen irrelevant und man kann das Rechteck für sich betrachten.
das halt die frage wie das rechteck orientiert ist. vermutlich gibt es in opencv sogar die unterscheidung zwischen achsenparallel und nicht achsenparallel. Da das ist allerdings nicht bekannt

@TorenAltair auch eine variante.

EDIT: zu @SaxnPaule wenn man es so sieht, dass man nur ein beliebiges rechteck hat, von dem man die seitenlängen kennt, dann ist deine antwort natürlich volllkommen richtig, aber in anbetracht der Anwendung können es ja 4 "näherungsweise" beliebige punkte auf der ebene sein.

auserdem sollte man bedenken, dass bei bestimmten winkeln komische sachen passieren könnten, darüber müsste man aber glaube genauer nachdenken
 
Zuletzt bearbeitet:
Zurück
Oben