Форум сайта python.su
Здравствуйте, пишу детектор пульса с использованием OpenCV, дело дошло до того из спектра надо выбрать нужную частоту смены цветов.
В области лба вычисляются средние значения красного и синего цвета для текущего кадра. Формируется массив разностей значений цвета для n последних кадров
import random from PIL import Image def averageColor(cv, image, frequency = 1): size = cv.GetSize(image) width = size[0] height = size[1] count = int(round((frequency * (width * height)) / 100)) sumR = 0 sumB = 0 squareR = 0 squareB = 0 rgb = [] i=0 while i < count: x = random.randint(0, width - 1) y = random.randint(0, height - 1) color = image[y, x] sumR += color[0]; sumB += color[2]; averR = int((sumR / count) << 16) averB = int( sumB / count) i += 1 return (averR, averB)
colors = average.averageColor(cv, image) diff = colors[0] ^ colors[1]
К массиву применяется быстрое преобразование Фурье. В полученном спектре ищется частота, удовлетворяющая следующим условиям: лежит в диапазоне, соответствующем пульсу (0.9-2.0 Гц); является максимальной в указанном диапазоне.
Отредактировано dem66 (Май 27, 2014 13:53:43)
Прикреплённый файлы:
fft.png (156,6 KБ)
Офлайн
Офлайн
В первом сообщении сделал опечатку, массив разностей получаю вот так:
c = 1 red = [] blue = [] while True: #тут находится лицо и производятся прочие операции.. #передаем на обработку участок лба av = average.averageColor(cv, forehead) red.append(av[0]) blue.append(av[1]) #каждые десять кадров получаем массив различий пикселей if c == 10: red = set(red) blue = set(blue) diff = list(red ^ blue) print diff c = 1 red = [] blue = [] else: c += 1
import numpy as np import matplotlib.pyplot as plt Fs = 100 # sampling rate Ts = 1.0/Fs # sampling interval signal = [10,11,12,13,-5,-6,-7,8,10,11,12] n = len(signal) # length of the signal k = np.arange(n) T = n/Fs frq = k/T # two sides frequency range freq = frq[range(n/2)] # one side frequency range print freq print "\n" Y = np.fft.fft(signal)/n # fft computing and normalization Y = abs(Y[range(n/2)]) print Y plt.plot(freq, Y, 'r-') plt.xlabel('freq (Hz)') plt.ylabel('|Y(freq)|') plt.show()
Отредактировано dem66 (Май 27, 2014 22:04:12)
Офлайн
dem66:) Нет. Правельно -> Правильно
Правельно ли я делаю?
Отредактировано doza_and (Май 27, 2014 20:59:46)
Офлайн