Hallo,
um ein Objekt im Raum zu verfolgen, ist an dem Objekt eine LED
angebracht und die Webcam meines PC auf das Objekt gerichtet. Die LED
wird über einen UART-Befehl des PC über einen Atmega8 an-, bzw.
ausgeschaltet. Das klappt via Terminal-Programm und auch per Python so
wie es soll.
Ich will jetzt mit OpenCV immer abwechselnd ein Bild bei ausgeschalteter
LED aufnehmen, dann eines bei eingeschalteter, etc. Dann will ich die
jeweiligen Bilder vergleichen und dann (wie bereits bei anderen
Projekten) aus dem Unterschied zwischen den Bildern die Position des
Objektes berechnen.
Nur klappt das nicht richtig, denn bei den Aufnahmen ist mal die LED zu
sehen, obwohl sie aus sein sollte, oder umgekehrt. Ich habe erst
gedacht, dass im Hintergrund die Daten seriell noch nicht versendet
wurden, aber auch wenn ich den uC "antworten" lasse, und vor der
Aufnahme auf diese Antwort warte, sodass die LED sicher an sein müsste,
tritt das Problem auf.
Meine Mutmaßung: Es wird nicht das aktuellste Bild des Videostreams
ausgelesen, sondern eines aus einem Buffer, das schon etwas "älter" ist.
Liege ich da richtig, oder gibt es andere Ursachen? Hat jemand eine
Idee, wie ich dem Problem auf die Spur komme?
1 | import cv2
|
2 | from skimage.metrics import structural_similarity as ssim
|
3 | import imutils
|
4 | import numpy as np
|
5 | import time
|
6 | import serial
|
7 |
|
8 | led_an = bytearray([10])
|
9 | led_aus = bytearray([20])
|
10 | ser = serial.Serial("COM3", 9600)
|
11 | cap = cv2.VideoCapture(0)
|
12 | try:
|
13 | while True:
|
14 | ser.write(led_aus)#beim Empfangen diese Befehls schaltet der uC (noch in der ISR) die LED aus
|
15 | ser.write(bytearray([40]))#hiermit wird eine "Antwort" des uC angestoßen
|
16 | eingang = ser.read(1)#Es gibt kein Timeout, also wartet das Programm hier, bis der uC wirlich geantwortet, ergo die LED ausgeschaltet hat
|
17 | if eingang == bytearray([40]):
|
18 | ret, bild0 = cap.read()
|
19 | eingang = 0
|
20 | ser.write(led_an)#hier das gleiche Spiel nochmal, nur dass hier die LED angeschaltet wird
|
21 | ser.write(bytearray([40]))
|
22 | eingang = ser.read(1)
|
23 | if eingang == bytearray([40]):
|
24 | ret, bild1 = cap.read()
|
25 | eingang = 0
|
26 | cv2.imshow("bild0", bild0)#hier sollte die LED nicht zu sehen sein (ist sie aber oft)
|
27 | cv2.imshow("bild1", bild1)#...und hier sollte sie sichtbar sein
|
28 | cv2.waitKey(1)
|
29 | except KeyboardInterrupt:
|
30 | ser.close()
|
31 | exit()
|