#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
более последовательно следовать своей логике и идти оттуда.