Как использовать изображения / кадры, снятые с веб-камеры, для отправки процесса в том же скрипте

#python #opencv #webcam #motion-detection

#python #opencv #Вебкам #обнаружение движения

Вопрос:

По сути, у меня есть детектор движения, который работает с использованием моей веб-камеры, и он принимает первый кадр как «dart_0», а затем при обнаружении движения принимает кадр как «dart_1».

Я хочу иметь возможность сохранять эти изображения, чтобы я мог немедленно отправлять их в тот же файл / скрипт python.

В настоящее время он сохраняет их в виде файла .png, но после цикла while он не позволяет мне читать вновь созданные файлы. Это позволяет мне делать это только в отдельном скрипте, который мне не нужен.

Я спрашиваю, есть ли способ, чтобы при прерывании цикла while я мог сохранять изображения локально в скрипте, с которым я мог бы немедленно работать после их получения.

Пока это мой код, который работает идеально, как я хочу, но я не могу использовать изображения, которые я только что создал, после разрыва цикла while.

 import cv2

first_frame = None
video = cv2.VideoCapture(0, cv2.CAP_DSHOW)
video.set(cv2.CAP_PROP_BUFFERSIZE, 0)

img_counter = 1

throw_count = 1
throw_limit = 5

while throw_count < throw_limit:

    status, frame = video.read()
    #print(status)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (21, 21), 0)

    if first_frame is None:
        first_frame = gray
        cv2.imwrite(filename='dart_0.png', img=frame)
        print("Empty Picture Captured")
        continue

    #cv2.imshow("Frame", frame)
    #cv2.imshow("Capturing", gray)

    delta_frame = cv2.absdiff(first_frame, gray)
    thresh_delta = cv2.threshold(delta_frame, 30, 255, cv2.THRESH_BINARY)[1]
    thresh_delta = cv2.dilate(thresh_delta, None, iterations=0)
    contours, res = cv2.findContours(thresh_delta.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    #cv2.imshow("Delta", delta_frame)
    #cv2.imshow("Thresh", thresh_delta)

    for contour in contours:
        if cv2.contourArea(contour) > 100:
            #(x, y, w, h) = cv2.boundingRect(contour)
            #cv2.rectangle(frame, (x, y), (x   w, y   h), (0, 255, 0), 3)
            throw_count  = 1
            cv2.imwrite(filename='dart_1.png', img=frame)
            print("Image Saved")

print("Loop Ended")
 

Ответ №1:

Если последнее изображение, с которым вы работали в цикле, — это то, которое вы хотите сохранить для дальнейшего анализа, сохраните его в переменной ( selected_frame ), например, перед сохранением на диск:

 for contour in contours:
    if cv2.contourArea(contour) > 100:
        throw_count  = 1
        selected_frame = frame.copy()
        cv2.imwrite(filename='dart_1.png', img=frame)
        print("Image Saved")
 

Первый кадр уже сохранен в переменной first_frame и готов к использованию в последующем коде.

Комментарии:

1. Спасибо за ваш ответ. Я хотел бы иметь возможность использовать cv2.subtract(dart0, dart1) для вычитания двух сделанных мной изображений, а затем порогового значения, расширения и размывания нового изображения. Возможно ли это? и если бы вы могли поделиться кодом для этого в первом скрипте, которым я поделился, это было бы здорово.

2. После того, как изображения будут сохранены как переменные, вы можете выполнять с ними любые операции, которые захотите. Вы difference = cv2.subtract(first_frame, selected_frame) также можете назвать изображения dart0 и dart1 более последовательно следовать своей логике и идти оттуда.