Как применить детектор объекта к каждому кадру данного видео? - PullRequest
0 голосов
/ 08 января 2020

Я разместил код на этом сайте раньше, и я узнал, что я не могу опубликовать все это. Итак, я буду публиковать только код, который имеет значение.

Итак, я пытаюсь взять детектор объектов (для изображений) и применить его к каждому кадру данного видео.

Единственное, что я не знать, как это сделать. То есть, когда я обнаруживаю первый кадр, что мне делать с этим кадром? Я храню это где-нибудь? Что мне делать с другими кадрами? И как только я обработаю эти кадры, как мне объединить эти кадры в видео ie выходное видео?

Вот код:

import numpy as np
import cv2
from numpy import expand_dims
from keras.models import load_model
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from matplotlib import pyplot
from matplotlib.patches import Rectangle

model = load_model('model.h5')

# define the expected input shape for the model
input_w, input_h = 416, 416

# define the anchors
anchors = [[116,90, 156,198, 373,326], [30,61, 62,45, 59,119], [10,13, 16,30, 33,23]]

# define the labels
labels = ["person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train", "truck",
    "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench",
    "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe",
    "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard",
    "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard",
    "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana",
    "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake",
    "chair", "sofa", "pottedplant", "bed", "diningtable", "toilet", "tvmonitor", "laptop", "mouse",
    "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator",
    "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush"]

vs = cv2.VideoCapture('video.mp4')

class_threshold = 0.6
boxes = list()

while True:
    (grabbed, frame) = vs.read()

    if not grabbed:
        break

    if W is None or H is None:
        (H, W) = frame.shape[:2]

    image, image_w, image_h = load_image_pixels(frame, (input_w, input_h))
    yhat = model.predict(image)

    for i in range(len(yhat)):
        # decode the output of the network
        boxes += decode_netout(yhat[i][0], anchors[i], class_threshhold, input_h, input_w)
    # correct the sizes of the bounding boxes for the shape of the image
    correct_yolo_boxes(boxes, image_h, image_w, input_h, input_w)
    # suppress non-maximal boxes
    do_nms(boxes, 0.5)

    # get the details of the detected objects
    v_boxes, v_labels, v_scores = get_boxes(boxes, labels, class_threshold)

    # draw what we found
    draw_boxes(frame, v_boxes, v_labels, v_scores)

1 Ответ

1 голос
/ 09 января 2020

Вы можете использовать VideoWriter из opencv для повторного вывода кадров в виде видео.

Некоторые примеры кода о том, как его использовать:

fourcc = cv2.VideoWriter_fourcc(*'XVID')
video_writer = cv2.VideoWriter('test.avi', fourcc, 30, (image_w, image_h))
...
while True:
    ....
    video_writer.write(frame)
    ....
....
video_writer.release()

Для ссылка OpenCV сохранение видео в python

...