Я использую программный триггер для захвата изображений с помощью веб-камеры. У меня уже есть что-то вроде ниже:
import cv2
import gc
import time
import numpy as np
def capture():
vidoe_cap = cv2.VideoCapture('http://ip:port/video')
_, frame1 = vidoe_cap.read() # first image
while (vidoe_cap.isOpened()== True):
# Capture frames
_, frame2 = vidoe_cap.read() # second image
# Here Euclidean distance between the two frames are done.
area = np.absolute(cv2.norm(frame1, frame2, cv2.NORM_L1)/10000000)
if area > area_threshold:
cv2.imwrite(/path/to/same/image, frame2)
time.sleep(2) # slight delay
del frame2, frame1
gc.collect()
while(True):
try:
capture()
except cv2.error as e:
print('Reconnecting 1...')
continue
except:
print('Reconnecting 2...')
continue
Базовый триггер основан на вычислении евклидова расстояния между двумя последовательными кадрами. Если объект попадает в поле зрения камеры, евклидово расстояние между двумя кадрами увеличивается, и это запускает захват изображения (area_threshold - эмпирическое значение) и сохраняет его на диске. Этот простой фрагмент работает.
Однако один крайний случай заключается в том, что объект входит и остается неподвижным в течение 10 минут (как долго это неизвестно!), И я не хочу постоянно захватывать изображения для каждого буфера, НЕ больше чем это в X раз (просто захватите 5 или 10 кадров). В то же время я буду sh, чтобы не нарушить код. Я ищу действие `` ждать '' (но не простой Python time.sleep), а что-то, что снова прослушивает изменение области и возобновляет условие `` если '', если новый или аналогичный объект снова входит в поле вид в камеру! Это сделано для того, чтобы избежать захвата потерянных последовательных (похожих) буферов!
Любые комментарии и предложения приветствуются!