Die Mathe-Redaktion - 15.12.2019 14:49 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 756 Gäste und 24 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von Bilbo matph
Angewandte Informatik » Computergrafik » Bildverarbeitung: Winkelgeschwindigkeit aus Video ermitteln
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule Bildverarbeitung: Winkelgeschwindigkeit aus Video ermitteln
Lucky_7
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 21.01.2018
Mitteilungen: 164
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2019-05-14


Ich habe ein Video von einem Elektro-Auto, in dem sich einer der Reifen dreht:


Das Auto selbst bewegt sich im Video also nicht fort, aber das Rad beschleunigt mit unterschiedlichen Werten.

Ich würde gerne aus diesem Video bestimmen, mit welcher Geschwindigkeit das Rad rotiert. Meine Idee hierzu: Ich betrachte z.B. das rechte Rad und konzentriere mich auf eine der Speichen. Dann versuche ich herauszufinden wie weit sich diese Speiche von einem Frame zum nächsten bewegt.

Aber so wirklich konkret weiß ich nicht wie ich das anstellen kann.
Hat hier jemand Erfahrung in diesem Bereich? Was wäre eine geeignete Vorgehensweise/Methode, um die Winkelgeschwindigkeit zu ermitteln?



  Profil  Quote  Link auf diesen Beitrag Link
hgseib
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 04.04.2019
Mitteilungen: 172
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2019-05-14


Hallo

Du kennst bestimmt auch den Effekt mit Speichen und das es so aussehen kann, als wenn sich die Räder rückwärts drehen?
Die Frage ist also: Um wieviel Grad drehen sich die Räder von Aufnahme zu Aufnahme?

Und Stichwort: Stroboskop
(mit sowas habe ich noch mein Auto und meinen Plattenspieler eingestellt ;-)

mfg



  Profil  Quote  Link auf diesen Beitrag Link
dlchnr
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 20.04.2013
Mitteilungen: 157
Aus: Aalen, DE
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, eingetragen 2019-05-14


Meine Idee wäre, in einer kleinen "Area of Interest" eine schwarz/wei0 Wandlung mittels Schwellwertfunktion durchführen und dann ein Mittelwertbildung innerhalb der AoI durchführen, den Mittelwert zeitlich aufzeichnen und aus dem entstandenen Signal die Frequenz ermitteln.






  Profil  Quote  Link auf diesen Beitrag Link
Lucky_7
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 21.01.2018
Mitteilungen: 164
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, vom Themenstarter, eingetragen 2019-05-17


hey dlchnr,

vielen Dank für die Hilfe! Das hört sich nach einer guten Idee an, die ich gleich mal ausprobiert habe :-)

Ich habe also ein Rechteck eingezeichnet, das als AoI dient. Und innerhalb dieses Rechtecks habe ich einen Schwellwert gesetzt, sodass alle Pixel mit einer Intensität kleiner 60 als schwarz und alle anderen Pixel als weiß gewertet werden.

Dann habe ich den Mittelwert dieser Intensitäts-Werte innerhalb der ROI gebildet und das Ergebnis für jeden Frame in eine .txt-Datei geschrieben.

Die Frage bleibt: Wie kann ich hieraus die Frequenz / Umdrehungen des Rads pro Sekunde bestimmen?

Ich erhalte z.B. die folgenden Werte:
txt
104.73214285714285
104.73214285714285
255.0
165.44642857142856
104.73214285714285
104.73214285714285
104.73214285714285
104.73214285714285
255.0
125.98214285714285
104.73214285714285
104.73214285714285
104.73214285714285
106.25
255.0
104.73214285714285
104.73214285714285
104.73214285714285
104.73214285714285
104.73214285714285
255.0
133.57142857142856
104.73214285714285
104.73214285714285
104.73214285714285
104.73214285714285
106.25
255.0
165.44642857142856
104.73214285714285
104.73214285714285
104.73214285714285
104.73214285714285
104.73214285714285
255.0
177.5892857142857
104.73214285714285
104.73214285714285
104.73214285714285
104.73214285714285
189.73214285714283
255.0
104.73214285714285
104.73214285714285
104.73214285714285
104.73214285714285
229.19642857142856
210.98214285714283
104.73214285714285

Eine Speiche hat also den Wert 255. Der Raum zwischen den Speichen hat den Wert 104.732. Aber da es auch Frames gibt, in denen eine Speiche nur zum Teil innerhalb der AoI liegt, gibt es auch Zwischenwerte.

Wie gehe ich also weiter vor?  
Um die Geschwindigkeit zu ermitteln, würde ich die Frames zählen, die zwischen zwei Werten von 255 (oder nahe dran, vrmtl. bis 180) liegen.
Der Radius der Räder beträgt 5cm. Und der Winkel zwischen zwei Speichen beträgt 72°. Die Geschwindigkeit beträgt also:
\[\frac{2 \pi}{360°} \cdot 72° * 50mm \cdot \frac{\text{Anzahl Framerate}}{\text{Frames}}\]

Passt das, was ich hier gerade von mir gebe?



  Profil  Quote  Link auf diesen Beitrag Link
dlchnr
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 20.04.2013
Mitteilungen: 157
Aus: Aalen, DE
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, eingetragen 2019-05-17


Zunächst mal sollte klar sein, dass das so nur funktioniert, wenn du mehr als zwei Frames pro Speichendurchgang vorliegen hast.

Dann scheinst du mir dem Schwarz keine 0 zugewiesen zu haben (denn als Mittelwert von lauter schwarzen Werten sollte auch die 0 auftreten) oder dein Schwellwert passt noch nicht (erstelle dafür ein Histogramm der AoI über einen kompletten Umlauf, dann sollte ein geeigneter Schwellwert zu finden sein).

Dann würde ich die AoI möglich gross, aber doch so klein machen, dass sie komplett in eine Speiche passt - ich vermute, ein Rechteck wird besser sein als ein Quadrat.

Das weitere Vorgehen hängt ein wenig vom Verhältnis Frames pro Speichendurchgang ab. Ist das sehr hoch, erwarte ich, dass ein Plot in etwa so aussieht:
255                 ___                   ____
                  /    \                 /    \
                /        \             /        \
 0   _________/            \_________/            \_________
 

In dem Fall kannst du die Punkte deiner Kurve miteinander verbinden und die Frequenz über den Schnittpunkt mit der Schwellwertlinie ermitteln.

Ist das Verhältnis eher niedrig, erhälst Du nur wenig Punkte dieser Kurve und es ist Mathematik angesagt - im Prinzip ist die Grundschwingung zu ermitteln - das sollte gehen, indem du mittels Regression aus deinen Punkten einen Sinus berechnest - ich denke da können dir dann die Mathematiker hier weiterhelfen (ich habe bis dato nur lineare Regressionen durchgeführt).



  Profil  Quote  Link auf diesen Beitrag Link
dlchnr
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 20.04.2013
Mitteilungen: 157
Aus: Aalen, DE
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2019-05-17


Hab' mal 'nen Plot deiner bislang gewonnenen Daten erstellt - scheint mir schon mal 'ne brauchbare Grundlage zu sein.






  Profil  Quote  Link auf diesen Beitrag Link
hgseib
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 04.04.2019
Mitteilungen: 172
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, eingetragen 2019-05-18


Hallo

Im Vergleich ein Barcodescanner: Es werden Streifen am 'Lesegerät' vorbeigezogen. Es wird der Wechsel von Hell und Dunkel festgestellt und gezählt, bis zum nächsten Ereignis. Die Grösse der Summe entscheidet, ob es ein schmaler oder breiter Streifen war, und über die Zeit wird damit eine eventuelle Geschwindigkeitänderung berücksichtigt.

Ein Rad mit Speichen ist dem vergleichbar.
a) Hier dürfte die Herausforderung daran liegen, das ein Video (25 Frames/Sekunde ?) zu wenig Messwerte liefert? Kommt darauf an, wie schnell sich das Rad maximal drehen kann.
b) Angenommen, das Rad (5 Speichen) dreht sich um 72Grad (oder vielfachem davon) pro Frame, dann steht es (für die stichprobenartige Messung/ Stroboskop) still.
c) Man kann nicht unterscheiden, ob sich das Rad pro Frame z.B. um 350 Grad vor oder um 10 Grad zurück gedreht hat.

zu a) Beim Farbbild kann man sehr schön die Bewegungsunschäfte erkennen. Damit lässt sich ein richtiger Stillstand von einem rein optischen Stillstand unterscheiden. Bei 0 - 72 - 144 - .. Grad pro Frame steht das Rad optisch gesehen still. Aber die Bewegungsunschäfte wird breiter/ verwaschener und auf Grund der Belichtungszeit erscheint die Speiche breiter. Es wäre nützlich die Belichtungszeit zu kennen.

zu b) Bei Analog (sehr hohe Framerate) genügt es, einen Punkt auszuwerten. Auf Grund der geringen Messdichte durch Videobilder würde ich einen schmalen Streifen (besser Kreisbogen 72Grad ?) auswerten, der möglichst weit weg von der Narbe liegt. So hat man einen Querschnitt durch die Speiche.

zu c) Entweder ist die Drehrichtung bekannt, oder es wäre nützlich, wenn man die Drehbeschleunigung von Stillstand an erfasst. Das ein Rad plötzlich die Drehrichtung ändert kann man ausschliessen. Ein scheinbares rückläufiges Drehen kann dann eher als Erhöhung der Drehung pro Frame gewertet werden.

Das sind nur allgemeine Überlegungen.
mfg



  Profil  Quote  Link auf diesen Beitrag Link
Yggdrasil
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 01.07.2004
Mitteilungen: 855
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2019-05-18


Hallo,

ich würde keine Speiche betrachten sondern eher einen Kreisbogen um den (bekannten) Mittelpunkt des Rades.
Letztlich braucht man in Frame A nur einen Helligkeitswechsel heraussuchen und sucht (im einfachsten Fall bei hinreichender zeitlicher Auflösung)
in Frame A+1 nach der nächstgelegenen Helligkeitsschwankung.
Die Differenz kann man leicht in eine Winkelgeschwindigkeit umrechnen.

Bei dem Ansatz braucht man nur zwei Frames und muss nicht darauf warten, dass eine Speiche „am Fenster vorbeikommt“.
Um Fehler bedingt durch die räumliche Auflösung der Kamera zu reduzieren, kann man auch für jede der Speichen einen Wert berechnen und dann mitteln und/oder Ausreißer entfernen.

Gruß Yggdrasil



  Profil  Quote  Link auf diesen Beitrag Link
Lucky_7
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 21.01.2018
Mitteilungen: 164
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, vom Themenstarter, eingetragen 2019-05-19


Wow, vielen Dank für die rege Beteiligung!

Yggdrasil, kannst du mir genauer erklären, was du mit einem Helligkeitswechsel meinst?

Was mache ich momentan? - Ich betrachte das Video Frame für Frame als Grayscale. Und auf diese Grayscale-Werte wende ich innerhalb einer rechteckigen AoI eine Schwellwert-Funktion an, sodass ich am Ende nur weiße und schwarze Pixel habe. Dann bilde ich den Mittelwert über diese Pixelwerte innerhalb der AoI. Und das mache ich für jeden Frame. Ist das nicht ein Helligkeitswechsel, den ich betrachte?

Warum würdest du dir einen Kreissektor statt eines Rechtecks anschauen? Was macht das für einen Unterschied?



  Profil  Quote  Link auf diesen Beitrag Link
Yggdrasil
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 01.07.2004
Mitteilungen: 855
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, eingetragen 2019-05-20


Mit dem Helligkeitswechsel ist die Flanke von Weiß zu Schwarz am Rand einer Speiche gemeint.
Bei langsamen Bewegungen des Rades (Rolling-Shutter-Effekt vernachlässigbar und die Speichen sind auch nicht zu stark verwischt) kann man in zwei Frames die Speichen markieren und den Winkel ablesen. Ab 1/10 Radumdrehungen/Frame wird kann man die richtige Speiche ohne Vorgabe der Drehrichtung im zweiten Frame nicht mehr identifizieren können. Dazu hast du WIMRE bisher aber auch keine Informationen geliefert.



@Unterschied
Beim AoI-Ansatz muss man bei langsamen Bewegungen warten, bis eine Speiche durch das Gebiet läuft. Man beschränkt sich also auf einen Ort und nutzt die zeitliche Veränderung zur Ermittlung der Frequenz.
Betrachtet man einen Kreisbogen nutzt man eindimensionale Ortsdaten und dafür nur noch zwei Frames.





  Profil  Quote  Link auf diesen Beitrag Link
Lucky_7
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 21.01.2018
Mitteilungen: 164
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, vom Themenstarter, eingetragen 2019-05-20


@dlchnr: Du hast recht, ich erhalte nicht ein einziges Mal den Mittelwert 0 innerhalb meiner AoI. Das liegt daran, dass ich die rechteckige AoI tatsächlich eingezeichnet habe (mit einer Pixel-Breite von einem px). Und dieser Pixel liegt mit in meiner AoI. Ich habe das geändert und erhalte jetzt auch eine Vielzahl von 0.0 als Mittelwert der Pixelwerte innerhalb meiner AoI

@Yggdrasil: Vielen Dank für die Hilfe! Das sieht nach einem interessanten Ansatz aus, ist für mein Vorwissen aber vlt. etwas zu kompliziert. Wenn ich dich richtig verstehe, schlägst du vor die Frequenz der Radumdrehungen anhand des Winkels zu bestimmen, um den sich die Speiche von einem Frame zum nächsten ändert. Dazu muss ich aber in der Lage sein die Speiche zu markieren und zu tracken, richtig?



  Profil  Quote  Link auf diesen Beitrag Link
Yggdrasil
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 01.07.2004
Mitteilungen: 855
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.11, eingetragen 2019-05-20


Du musst ja nicht die ganze Speiche erkennen, sondern nur den Ausschnitt innerhalb des Kreisrandes. Damit ist es ein eindimensionales Tracken und meiner Meinung nach nicht sehr schwierig.
Du kannst beispielsweise [0,2π] diskretisieren und auf den markierten Kreisrand im Bild abbilden. Dabei trifft man nicht immer genau ein Pixel, aber man kann ja die vier nächstgelegenen (oder einfach eins…) nehmen.

Das ist dann also eine Folge von 1 (weiß) und 0 (schwarz). Ab und zu könnten einzelne Pixel weiß sein, aber die sechs längsten Teilfolgen von 1 sollten dann die Speichen sein.

Ist Speiche(k,n) die gemappte Position von Speiche k in Frame n, so ist die Winkelgeschwindigkeit einfach Speiche(k,n+1) - Speiche(k,n)



  Profil  Quote  Link auf diesen Beitrag Link
Lucky_7
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 21.01.2018
Mitteilungen: 164
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.12, vom Themenstarter, eingetragen 2019-05-21


@Yggdrasil: ok, ich schaue mir deinen Ansatz später mal an. Ich versuche jetzt gerade den Ansatz von dlchnr, weil ich das Skript hierzu bereits geschrieben habe.

@dlchnr: Ich habe jetzt eine .txt-Datei erstellt, die zwei Spalten besitzt: In der ersten Spalte steht ein timestamp, in der zweiten der Mittelwert der Pixel-Intensität innerhalb der AoI: hier


Aus dieser .txt-Datei habe ich die Geschwindigkeit ermittelt. Diese Geschwindigkeit vergleiche ich mit Werten, die ein Encoder liefert.
Ein Encoder arbeitet nach einem ganz ähnlichen Prinzip: Ein Kreis, der abwechselnd aus schwarzen und weißen Segmenten besteht (insgesamt 36) befindet sich auf einem Zahnrad, das auf der Kurbelwelle sitzt. Und auf diese Encoder-Scheibe ist ein Infrarot-Laser gerichtet, der nur vom weißen Hintergrund reflektiert wird. Jedes mal wenn der IR-Strahl unterbrochen wird, wird im Mikrocontroller ein Interrupt ausgelöst und auf diese Weise wird die Geschwindigkeit berechnet.

Leider sind mir die Video-Daten noch zu ungenau:


Ich frage mich, ob meine Frames vielleicht zu verschwommen sind. Hier sind mal zwei aufeinander folgende Frames:





Könnte ich genauere Ergebnisse erzielen, indem ich einen Blur-Filter einsetze?
Übrigens: Die Räder drehen sich im Uhrzeigersinn. Und wenn ich mir die Frames einzeln anschaue scheinen sich die Speichen pro Frame auch nicht um mehr als einen halben Speichenwinkel weiter zu bewegen. Die Framerate beträgt 30fps.

 



  Profil  Quote  Link auf diesen Beitrag Link
dlchnr
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 20.04.2013
Mitteilungen: 157
Aus: Aalen, DE
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.13, eingetragen 2019-05-25


mich wundert etwas, wie "verhackstückelt" deine Daten in nyData.txt nun sind - entweder hat sich ein Fehler eingeschlichen oder der erste Datensatz sah nur auf Grund eines "Dreckeffekts/Fehlers" so gut aus (vielleicht "Unterabtastung" de.wikipedia.org/wiki/Alias-Effekt#Signalverarbeitung).

Mir scheint zudem der Vorschlag von Yggdrasil geeignerter, um mit einfachen mathematischen Mitteln zum Ziel zu kommen (keine Anpassung der Daten mittels Regression an eine Grundwelle oder FFT oder dergleiche).

Du solltest für jedes Bild etwa so eine Kurve bekommen:
   __      __      __      __      __
___  ______  ______  ______  ______  ___
 
<---------------- 2 pi ---------------->
 

Für zwei aufeinanderfolgende Bilder dann:
   __      __      __      __      __
___  ______  ______  ______  ______  ___
   \ 
    \__      __      __      __      __
_____  ______  ______  ______  ______  _
 
<---------------- 2 pi ---------------->
 

Jetzt kannst du an allen 10 Flanke ausmessen, welchen Winkelversatz die Speichen zwischen zwei Bildern haben, diese mitteln und daraus direkt die Winkelgeschwindigkeit ermitteln.

Und wenn Du eine höhere Genauigkeit erreichen möchtest, kannst Du einefach mehrere Kreise mit unterschiedlichen Radien scannen und hast dann eben 20, 30 40 oder 50 Werte, über die Du die Geschwindigkeit zwischen zwei Bildern mitteln kannst.

Aus den Kurven mehrer Einzelbilder hintereinander sollte man dann auch ersehen können, ob u.U. eine Unterabtastung vorliegt - es wird dann aus der Abfolge der Kurve keine sinnvolle Bewegung (wie jetzt unten) erkennbar sein.
   __      __      __      __      __
___  ______  ______  ______  ______  ___
   \ 
    \__      __      __      __      __
_____  ______  ______  ______  ______  _
     \ 
_     \__      __      __      __      _
 ______  ______  ______  ______  ______ 
       \ 
 __     \__      __      __      __      
_  ______  ______  ______  ______  _____   
 
<---------------- 2 pi ---------------->
 





  Profil  Quote  Link auf diesen Beitrag Link
Lucky_7
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 21.01.2018
Mitteilungen: 164
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.14, vom Themenstarter, eingetragen 2019-05-27


hey,

ich muss jetzt doch nochmal eine Frage stellen:
Ich bin gerade dabei den Ansatz von Yggdrasil umzusetzen. Bisher ist es mir gelungen das Video als Grayscale einzulesen. Ich markiere dann eines der Räder als ROI und wende in diesem Bereich eine Schwellwert-Funktion an. Ich mache das nur in diesem markierten Bereich, weil ich mir das Video anzeigen lasse und es so schöner aussieht. Weiterhin zeichne ich einen Kreis in eines der Räder ein. Das Ergebnis sieht folgendermaßen aus:



Genauso wie ich den Kreis eingezeichnet habe, kann ich auch die zugehörigen Koordinaten speichern. Natürlich werde ich nicht die exakten Koordinaten verwenden, weil ich hier ja gezeichnet habe. Aber über die folgende Python-Funktion erhalte ich die Koordinaten von Punkten auf einem Kreis um einen Mittelpunkt pt (ein Tuple):
Python
def compare_circle_contour(frame, pt, radius):
    discretized_circle_contour_x = [pt[0] + radius*np.cos(theta) for theta in np.linspace(0, 360, 360)]
    discretized_circle_contour_x = map(int, discretized_circle_contour_x)
    discretized_circle_contour_y = [pt[1] + radius*np.sin(theta) for theta in np.linspace(0, 360, 360)]
    discretized_circle_contour_y = map(int, discretized_circle_contour_y)
    discretized_circle_contour = zip(discretized_circle_contour_x, discretized_circle_contour_y)
    return discretized_circle_contou

Vielleicht nicht der schönste Code, dürfte aber funktionieren. Allerdings erhalte ich so auch nur die Koordinaten. Als nächstes muss ich schauen ob an diesen Koordinaten in meinem gray_frame auch Pixel liegen und, wenn ja, welche Intensität diese haben.

Jedenfalls ist gerade mein Problem, dass ich nicht weiß wie ich zwei aufeinanderfolgende frames mit einander vergleichen kann. Bisher laufen all meine Operationen in einer while-Schleife ab:
Python
while True: 
    ret, frame = cap.read()
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
#plot ROI and circle, threshold ROI

Was ich damit meine ist: Wo in dieser while-Schleife kann ich meine prev_ROI speichern? Eigentlich überhaupt nicht, weil diese Schleife ja ständig durchlaufen wird und mein prev_ROI somit mehr oder weniger zeitgleich mit ROI geupdated wird.



  Profil  Quote  Link auf diesen Beitrag Link
dlchnr
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 20.04.2013
Mitteilungen: 157
Aus: Aalen, DE
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.15, eingetragen 2019-05-28


Ich würde mir zunächst eine Tabelle mit 360, 720 oder 1440 Einträgen (je nach Auslösung Deines Videos) berechnen, in denen Du die xy- und vier Prozent-Werte der Kreispunkte vorab berechnest, die Du für die Auswertung heranziehst. Dann kannst Du damit für jeden Frame dir eine Kurve wie oben gezeichnet, aus dem Bild holen.
pseudo code
for (int i = 0; i < 360, i++) {
  int x  = (int) tabelle[i][0];
  int y  = (int) tabelle[i][1];
  double p0 = tabelle[i][2];
  double p1 = tabelle[i][3];
  double p2 = tabelle[i][4];
  double p3 = tabelle[i][5];
  grauwert[bildnr][i] = frame[x+0][y+0] * p0 
                      + frame[x+0][y+1] * p1
                      + frame[x+1][y+1] * p2
                      + frame[x+1][y+0] * p3;
}
 

Ein Tabelleneintrag enthält die unteren, linken Koordinate eines Pixels von vier Pixeln, die zu Deinem Kreis gehören und vier Anteilen, wie diese in Dein Kreispixel eingehen. Die Anteile berechnest Du aus den Nachkommawerten der xy-Koordinaten. Ein Kreispixel mit den xy-Nachkommawerten (0.5 / 0.5) trifft genau ein Framepixel und die Anteile sind dann 1.0, 0.0, 0.0 und 0.0. Für xy-Nachkommawerten von (0.75 / 0.75) ergäbe sich 9/16, 3/16, 1/16 und 3/16.

 

 



  Profil  Quote  Link auf diesen Beitrag Link
Lucky_7
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 21.01.2018
Mitteilungen: 164
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.16, vom Themenstarter, eingetragen 2019-05-28


So. Ich habs geschafft. D.h. was habe ich gemacht?

Ich habe die Pixel auf einem Kreisbogen, der einen Winkel von 36° einschließt, beobachtet. hier ist das Ergebnis.

Bei der Auswertung der Geschwindigkeit aus diesen Daten muss mir aber ein Fehler unterlaufen sein. Wie ermittel ich die Geschwindigkeit aus dieser Tabelle?

Naja, ich schaue mir an, in welcher Reihe mehr als 2x ein Wert von 255 vorkommt - mindestens 3x muss in dieser Reihe also die 255 stehen. Wenn das der Fall ist, dann gehe ich davon aus, dass hier eine Speiche zu sehen ist. Die Position der Speiche berechne ich so: Ich nehme den Index der Spalte, in welcher die erste 255 zu sehen ist, addiere die Hälfte der Gesamtzahl der Werte 255 aus dieser Reihe dazu und runde ggf. auf.
Und das Gleiche mache ich für die nächste Reihe. Dann schaue ich mir die Differenz der Position an. Diese Differenz dürfte gleich der Gradzahl sein, um welche sich das Rad weiter gedreht hat.
Und so gehe ich dann immer für zwei aufeinander folgende Speichen vor. D.h. wenn ich in einer Reihe eine Speiche erkenne, dann berechne ich aus dieser Reihe und der folgenden um wie weit sich die Speiche gedreht hat. Wenn ich dann wieder eine Speiche erkenne mache ich das gleiche usw.

Vielleicht ist das etwas schwer beschrieben: hier seht ihr meine Implementierung.

Allerdings scheint dieses Vorgehen nicht ganz richtig zu sein. Ist irgendetwas grundlegend falsch, oder stimmt die Idee?

Mein Plot ist dann dieser hier:





  Profil  Quote  Link auf diesen Beitrag Link
dlchnr
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 20.04.2013
Mitteilungen: 157
Aus: Aalen, DE
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.17, eingetragen 2019-05-29


Zeichne doch mal nicht nur 36°, sondern den Vollkreis auf und stelle die einzelnen Kurven grafisch dar - ich befürchte doch ein wenig, dass wir es mit einer Unterabtastung zu tun haben - anders kann ich mir das mehrmalige Auftreten der gleichen Daten in Deinem Daten-File in zwei Zeilen hintereinander nicht erklären.



  Profil  Quote  Link auf diesen Beitrag Link
Lucky_7
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 21.01.2018
Mitteilungen: 164
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.18, vom Themenstarter, eingetragen 2019-05-30


hmm... ok. Ich erhalte natürlich eine riesige Tabelle, wenn ich mir den gesamten Kreis anschaue: hier

Das Problem bei der Auswertung dieser Tabelle ist, dass eine Speiche sich ja fortbewegt. D.h. ich weiß nicht genau wie weit sie sich fortbewegt hat und welche Speichen ich miteinander vergleiche. Außerdem erhalte ich mit dem Skript, das ich geschrieben habe (hier) , zwar immer die gleiche Anzahl an Speichen 1-4, aber die Speiche 5 wird oftmals nicht erkannt. Auch das kann ich mir nicht erklären, führt aber eben genau dazu, dass ich diese Tabelle einfach nicht auswerten kann.




  Profil  Quote  Link auf diesen Beitrag Link
hgseib
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 04.04.2019
Mitteilungen: 172
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.19, eingetragen 2019-05-30


Hallo

Bei 5 Speichen je 360/5 = 72 Grad (siehe Beitrag No.6)
Ein Bogen von 72 Grad garantiert, das je Frame exakt eine Speiche erfasst wird. Mehr ist nicht nötig, weniger führt zu Messungen, die gar keine Speiche erfasst.

Vereinfachtes Beispiel:
Zur besseren Ansicht wird '0' als '-' angezeigt.
Der 72 Grad Bogen vereinfacht mit 12 Messpunkten,
somit erfasst jeder Messpunkt 72/12 = 6 Grad.

Der Film hat 30 Frames/Sekunde.
1 Frame zeigt somit wie weit sich das Rad in 1/30 = 0,0333 Sekunden gedreht hat.

Frame 1: ---123321---
Frame 2: -----123321-
Frame 3: 1------12332
Frame 4: 321------123
Frame 5: 23321------1

Nicht einen Punkt als Markierung verwenden, sondern aus allen Werten einer Zeile (72 Grad Bogen) den Mittelpunkt berechnen, um Ungenauigkeiten auszugleichen.
Beginnt die Zeile mit einem Wert, dann befindet sich der Rest der Speiche (es ist genau genommen die nächste Speiche) am Ende der Zeile.
Die Mitte der Speiche befindet sich bei diesem Beispiel bei
Frame 1: 6 * 6 Grad
Frame 2: 8 * 6 Grad
..
Somit dreht sich das Rad um 2*6 = 12 (bzw. um 72*n+12) Grad pro 0,0333 Sekunden.
Man braucht keine Tabelle? Man kann die Speichenmitte (ein Wert) je Frame berechnen.


Bewegungsunschärfe:
Solange ein Bild aufgenommen wird (Verschlusszeit) dreht sich das Rad weiter. Das entspricht in etwa dem, als wenn mehrere Einzelbilder addiert werden:

---1111----- das wäre natürlich analog zu sehen
----1111----
-----1111---

---123321--- Das zeigt dann eine Aufnahme

Im günstigsten Fall kann aus einem einzigsten Bild die Drehzahl ermittelt werden, wenn die Verschlusszeit (dürfte kleiner sein als 1/30stel) bekannt ist und wenn die Bewegungsunschärfe von einer Seite messbar ist. Um diesen Betrag hat sich das Rad innerhalb der Verschlusszeit gedreht.
Dito: wenn die Breite der Speiche bekannt ist (als Bogenmass an der Messstelle), dann (Breite der Messung - Speichenbreite)/2.

mfg



  Profil  Quote  Link auf diesen Beitrag Link
dlchnr
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 20.04.2013
Mitteilungen: 157
Aus: Aalen, DE
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.20, eingetragen 2019-06-02


2019-05-30 19:09 - Lucky_7 in Beitrag No. 18 schreibt:
.. zwar immer die gleiche Anzahl an Speichen 1-4, aber die Speiche 5 wird oftmals nicht erkannt.

Du must wohl bei der Auswertung noch etwas experimentieren und vorallem das Ergebnis grafisch aufbereiten.

Bildverarbeitung besteht üblicher Weise nicht darin, das man eine Idee hat, diese implementiert und das dann funktioniert, sondern eben aus einem stetigen Prozess mit ausprobieren, abändern, optimieren ... ;-)



  Profil  Quote  Link auf diesen Beitrag Link
Lucky_7 hat die Antworten auf ihre/seine Frage gesehen.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2019 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]