Как я могу изменить numpy.ndarray в то, что я могу график - PullRequest
0 голосов
/ 10 апреля 2019

У меня проблемы с отображением значения numpy.ndarray.У меня нет большого опыта, поэтому я могу ошибочно назвать некоторые из этих значений.Я верю, что это связано с тем, какой это класс.

По сути, у меня есть цикл while, который будет брать видеокадр, усреднять пиксели average_int, а затем графически отображать средние пиксели, которые создают хорошую частоту пиков.Затем среднее значение пикселя добавляется к result_array и проходит через функцию обнаружения пика signal.find_peaks_cwt.После этого я нахожу разницу пиков peaks_diff = peaks_pos[1:] - peaks_pos[:-1] и использую ее в качестве кадров между моими пиками, которые я помещаю в формулу, которая рассчитывает удары в минуту frequency = 60000/(peaks_frames * 60).

До этого момента это работало довольно хорошо, и следующим шагом было создание другого графа для графа frequency.Я скопировал способ, которым я нарисовал average_int, и это дает мне эту ошибку: ValueError: setting an array element with a sequence..

Вот мой текущий цикл while за вычетом графиков. РЕДАКТИРОВАТЬ : добавлены графические строки кода

cap = cv2.VideoCapture('cardiacbody.wmv')
fgbg = cv2.createBackgroundSubtractorMOG2(varThreshold=21, detectShadows=False)


x_len = 60
y_range = [-2, 30]

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

fig2 = plt.figure()
ax2 = fig2.add_subplot(2,1,1)

xs = list(range(0,60))
ys = [0] * x_len
ys2 = [0] * x_len

result_array = np.array([0])

line, = ax.plot(xs, ys, color='k')
line2, = ax2.plot(xs, ys2, color='b')

ax.set_ylim(y_range)
ax2.set_ylim(y_range)

plt.title('Movement over Time')


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

def animate2(i, ys2):
    ys2.append(frequency)
    ys2 = ys2[-x_len:]
    line2.set_ydata(ys2)
    return line2,

ani = animation.FuncAnimation(fig, animate, fargs=(ys,),interval=100, blit=False)
ani2 = animation.FuncAnimation(fig2, animate2, fargs=(ys2,),interval=100, blit=False)



while True:
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)

    cv2.imshow('Original', frame)
    cv2.imshow('Masked', fgmask)

    average = (np.average(fgmask))                                  # Average pixel intensity of frame

    average_int = int(average)                                      # Convert average into an integer                            

    result_array = np.append(result_array, average_int)             # Append average_int into result_array

    peaks_pos = signal.find_peaks_cwt(result_array, range(1, 3))    # Find peaks of result_array
    peaks_diff = peaks_pos[1:] - peaks_pos[:-1]                     # Count the frames between each peak
    peaks_frames = peaks_diff[-1:]                                  # Select counted frame value from end of array

    frequency = 60000/(peaks_frames * 60)                           # calculate beats per minute with 60000ms/(peaks_frames)*60ms

    print(type(average_int))      #class: 'int'
    print(type(frequency))        #class: 'numpy.ndarray
    print(frequency)
    plt.pause(0.00001)

    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

Основная проблема, по-видимому, заключается в том, что когда я рисую average_int, он работает, но когда я пытаюсь построить график frequency, я получаю ошибку,Классы разные, и я попытался преобразовать frequency в int или float, но это все равно не оказывает никакого влияния, и я получаю ту же ошибку.

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

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