Как запустить анимированный график из цикла opencv while? - PullRequest
0 голосов
/ 02 мая 2019

Я работаю над этим уже несколько недель, и я уверен, что это из-за моего отсутствия базовых знаний Python. Мне нужно что-то анимировать, используя функцию Matplotlib FuncAnimation. До сих пор я мог генерировать свои значения y в список, используя цикл while (эти значения колеблются вверх и вниз, что должно создать график, похожий на монитор сердца, когда он представлен с кадрами на оси x).

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

1) Я никогда не могу получить доступ к данным, созданным в цикле while, и использовать их для своего графика.

2) Я никогда не смогу построить график с помощью функции FuncAnimation при одновременном запуске цикла opencv while.

Может кто-нибудь, пожалуйста, потратьте время, чтобы просмотреть мой текущий код и указать на основные недостатки, я уверен, что это будет выглядеть довольно грязно, но я не знаю, с чего начать, чтобы заставить эту вещь работать. Я собираюсь начать с самого начала.

import numpy as np
import cv2
import matplotlib.pyplot as plt
import matplotlib.animation as animation


# Parameters
x_len = 200         # Number of points to display
y_range = [10, 40]  # Range of possible Y values to display

# Create figure for plotting
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
xs = list(range(0, 200))
ys = [0] * x_len
ax.set_ylim(y_range)

# Create a blank line. We will update the line in animate
line, = ax.plot(xs, ys)

def animate(i, ys):
    ys.append(avg)
    ys = ys[-x_len:]
    line.set_ydata(ys)
    return line,

def data_gen():
    average = (np.average(difference))
    average_int = int(average)
    return average_int

def initialize_camera(cap):
    _, frame = cap.read()
    return frame

#Set up plot to call animate() function periodically
ani = animation.FuncAnimation(fig, animate, fargs=(ys,), interval=50, blit=True)

plt.show()

if __name__ == '__main__':

    cap = cv2.VideoCapture(0)

    first_frame = initialize_camera(cap)
    while cap.isOpened():

        ret, frame = cap.read( )

        difference = cv2.absdiff(first_frame, frame)

        _, difference = cv2.threshold(difference, 18, 255, cv2.THRESH_BINARY)

        avg = data_gen()

        cv2.imshow('first frame', first_frame)
        cv2.imshow('Original', frame)
        cv2.imshow('difference', difference)



        print(avg)
        key = cv2.waitKey(30) & 0xff
        if key == 27:
            break

cap.release()
cv2.destroyAllWindows()
print('End Stream')

Цикл while, который создает все данные, находится в операторе if if __name__ == '__main__':, он должен запускаться и создавать мои значения y. Затем я хочу построить его со статической осью X в 200 точек. Мне нужно использовать функцию FuncAnimation и блиттинг, чтобы иметь достаточно FPS для точного чтения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...