- ВКонтакте
- РћРТвЂВВВВВВВВнокласснРСвЂВВВВВВВВРєРСвЂВВВВВВВВ
- РњРѕР№ Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР‚ВВВВВВВВРЎР‚
- Viber
- Skype
- Telegram
Как в теле бесконечного цикла однократно выполнить действие?
Решаю задачу по распознаванию объектов через камеру и openCV. Внутри бесконечного цикла запустил камеру. Хочу в момент, когда в поле зрении камеры появляется объект - скрипт мне однократно написал в консоль "yes". Но в консоль "yes" падает так долго, как долго находится объект в поле зрения камеры.
Вообще конечная задача - послать однократный сигнал на Arduino.
import cv2
def cam():
camera = cv2.VideoCapture(0)
i_see = False # флаг нахождения контура
while True:
success, frame = camera.read()
if success: # если прочитали успешно
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # переводим BGR в HSV
binary = cv2.inRange(hsv, (30, 50, 70), (60, 255, 255)) # пороговая обработка кадра
con, _ = cv2.findContours(binary,
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_NONE) # получаем контуры объектов
if len(con) != 0: # если нашли хоть 1 контур
max_con = max(con, key=cv2.contourArea) # выбираем самый большой
moments = cv2.moments(max_con) # получаем моменты контура
if moments["m00"] > 500: # площадь контура px
cx = int(moments["m10"] / moments["m00"]) # центр контура по x
cy = int(moments["m10"] / moments["m00"]) # центр контура по y
i_see = True # меняем флаг, если нашли контур
print("yes")
cv2.imshow('Video', binary)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
camera.release()
cv2.destroyAllWindows()
cam()
Ответы (1 шт):
Автор решения: denisnumb
→ Ссылка
По идее нужно отслеживать момент появления объекта, а не его присутствие.
Можно сделать флаг, который будет устанавливаться при первом написании yes
и далее при положительном значении флага обработка наличия объекта производиться не будет. Как только объект пропадает, флаг нужно сбросить
object_detected = False
while True:
. . .
if len(con) != 0:
. . .
if moments["m00"] > 500 and not object_detected:
print("yes")
object_detected = True
else:
object_detected = False
. . .