У меня проблемы с отображением значения 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, но это все равно не оказывает никакого влияния, и я получаю ту же ошибку.
Дайте мне знать, если вы хотите, чтобы мои строки кода моего живого графика.