我想在生成的1D numpy数组中的每个峰值之后触发一个计数

2024-03-29 08:18:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些代码,在每个循环之后,分析一个图像,然后将图像的平均像素强度值附加到一个一维数组(result_array)。所以这个一维数组每循环增长一个值。用时间表示的数组显示一个频率,我想启动一个计数器来计算每个“峰值”之间的帧,这样我就可以用这个值来计算每分钟的频率。你知道吗

例如:当我打印(result_array)时,我在28次循环后得到:

[255.   3.   1.   0.  16.  26.   3.   0.   0.   0.   0.   0.   0.   0.
   2.  11.   1.   0.   0.   0.   0.   0.   0.   0.   4.  12.   1.   0.] 

用肉眼观察,峰值是255、26、11和12,中间的每一个数字都是一帧,我想把它计算出来,变成一个频率方程的值。然后在每个峰值后刷新和重复。如何检测此位置,然后开始计数?我的编程知识很少,所以基础知识越多越好。你知道吗

这是我的循环:

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

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

    average = (np.average(fgmask))
    average_int = int(average)

    result_array = np.append(result_array, average_int)
    print(result_array) 

希望一切都清楚,如果你需要更多的信息请告诉我。你知道吗


Tags: 代码图像np像素数组resultarraycv2
2条回答

使用find_peaks_cwtscipy.signal得到所有峰的位置,然后 计算差异

>>> from scipy import signal
>>> peaks_pos = signal.find_peaks_cwt(result_array, range(1, 5))
>>> peaks_pos 
array([ 1,  5, 15, 25])
>>>
>>> peaks_pos[1:] - peaks_pos[:-1]
array([ 4, 10, 10])

借鉴@c2huc2hu在评论中的建议。你知道吗

from spicy.signal import find_peaks
peaks, _ = find_peaks(result_array)

现在是高峰

array([ 5, 15, 25])

它们是数组中峰值的索引。它本身应该作为你的计数器——在第一个峰值之前有五个元素,然后是十个(15-5),然后是十个(25-15)。你知道吗

您可以使用

result_array[peaks]

这将产生

array([26., 11., 12.])

数组的局部极大值。你知道吗

相关问题 更多 >