Может кто-нибудь помочь мне с чтением постоянно обновляемого видео-файла с Python? - PullRequest
1 голос
/ 10 октября 2019

У меня есть небольшая программа ImageAI, которая обнаруживает несколько объектов через мою веб-камеру и / или IP-камеру, заключительная часть выглядит примерно так:

execution_path = os.getcwd()
detector = VideoObjectDetection()
detector.setModelTypeAsYOLOv3()
detector.setModelPath(os.path.join(execution_path , "yolo.h5"))
detector.loadModel()
print('Model loaded')

cap = cv2.VideoCapture(0)

video_path = detector.detectObjectsFromVideo(camera_input=cap,
                        output_file_path=os.path.join(execution_path, "captured")
                        , frames_per_second=5, log_progress=True, detection_timeout=120)

print(video_path)

Это приводит к созданию файла avi, которыйзаписывает видео и обнаруживает объекты. В то время как я могу видеть прогресс, открывая этот файл, я должен закрыть его и открыть снова, чтобы увидеть текущий обновленный прогресс. Есть ли способ показать это видео с помощью встроенного% matplotlib и т. Д.?

enter image description here

1 Ответ

1 голос
/ 10 октября 2019

Я не использовал его, но если вы посмотрите документацию , он имеет необязательный параметр для возврата обнаруженного кадра:

- параметр return_detected_frame (необязательно)) : Этот параметр позволяет возвращать обнаруженный кадр в виде массива Numpy для каждого кадра, секунды и минуты обнаруженного видео. Возвращенный массив Numpy будет проанализирован в соответствующие функции per_frame_function, per_second_function и per_minute_function (см. Подробности ниже)

, а затем вам также необходимо передать функцию в этот параметр:

- параметр per_frame_function (необязательно): Этот параметр позволяет вам анализировать имя функции, которую вы определяете. Затем для каждого обнаруженного кадра видео функция будет проанализирована в параметре, и аналитические данные видео будут проанализированы в функции. Возвращенные данные можно визуализировать или сохранить в базе данных NoSQL для дальнейшей обработки и визуализации.

Новая функция должна выглядеть так же, как в документации:

def forFrame(frame_number, output_array, output_count, returned_frame):

    plt.clf()

    this_colors = []
    labels = []
    sizes = []

    counter = 0

    for eachItem in output_count:
        counter += 1
        labels.append(eachItem + " = " + str(output_count[eachItem]))
        sizes.append(output_count[eachItem])
        this_colors.append(color_index[eachItem])

    global resized

    if (resized == False):
        manager = plt.get_current_fig_manager()
        manager.resize(width=1000, height=500)
        resized = True

    plt.subplot(1, 2, 1)
    plt.title("Frame : " + str(frame_number))
    plt.axis("off")
    plt.imshow(returned_frame, interpolation="none")

    plt.subplot(1, 2, 2)
    plt.title("Analysis: " + str(frame_number))
    plt.pie(sizes, labels=labels, colors=this_colors, shadow=True, startangle=140, autopct="%1.1f%%")

    plt.pause(0.01)

Это будеттакже нанесите другие аналитические данные, но вы можете просто построить фрейм.

Ваш код должен будет измениться так, чтобы он выглядел следующим образом:

video_path = detector.detectObjectsFromVideo(camera_input=cap,
                        output_file_path=os.path.join(execution_path, "captured")
                        , frames_per_second=5, log_progress=True, detection_timeout=120,
                        return_detected_frame=True, per_frame_function=forFrame)

Обратите внимание на два последних аргумента.

Надеюсь, это поможет вам

...