2014-12-05 3 views
4

Я пытаюсь создать приложение, которое может обнаружить сердцебиение с помощью веб-камеры вашего компьютера. Я работаю над кодом с 2 недель и разработал этот код, и здесь я получил до сих порОбнаружение HeartBeat с помощью веб-камеры?

Как это работает? Иллюстрированные ниже ...

  1. Обнаружение лица с использованием OpenCV
  2. Получение изображения лба
  3. Применение фильтра для преобразования его в черно-белое изображение [вы можете пропустить его]
  4. Нахождение средней интенсивности зеленой Pixle на рамка
  5. Сохранение средних в массив
  6. Применение FFT (я использовал миним библиотеку) Экстракт сердцебиения из FFT спектра (Здесь, мне нужна помощь)

Здесь мне нужна помощь для извлечения пульса из спектра БПФ. Может кто-нибудь мне помочь. Here, это аналогичное приложение, разработанное в python, но я не могу отказаться от этого кода, поэтому я разрабатываю то же самое в процессе. Может ли кто-нибудь помочь мне отказаться от части этого кода python, где он извлекает сердцебиение.

//---------import required ilbrary ----------- 
import gab.opencv.*; 
import processing.video.*; 
import java.awt.*; 
import java.util.*; 
import ddf.minim.analysis.*; 
import ddf.minim.*; 
//----------create objects--------------------------------- 
Capture video; // camera object 
OpenCV opencv; // opencv object 
Minim  minim; 
FFT   fft; 
//IIRFilter filt; 
//--------- Create ArrayList-------------------------------- 
ArrayList<Float> poop = new ArrayList(); 
float[] sample; 
int bufferSize = 128; 
int sampleRate = 512; 
int bandWidth = 20; 
int centerFreq = 80; 
//--------------------------------------------------- 
void setup() { 
    size(640, 480); // size of the window 
    minim = new Minim(this); 
    fft = new FFT(bufferSize, sampleRate); 
    video = new Capture(this, 640/2, 480/2); // initializing video object 
    opencv = new OpenCV(this, 640/2, 480/2); // initializing opencv object 
    opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); // loading haar cscade file for face detection 
    video.start(); // start video 
} 

void draw() { 
    background(0); 
    // image(video, 0, 0); // show video in the background 
    opencv.loadImage(video); 
    Rectangle[] faces = opencv.detect(); 
    video.loadPixels(); 
    //------------ Finding faces in the video ----------- 
    float gavg = 0; 
    for (int i = 0; i < faces.length; i++) { 
    noFill(); 
    stroke(#FFB700); // yellow rectangle 
    rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height); // creating rectangle around the face (YELLOW) 
    stroke(#0070FF); //blue rectangle 
    rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height-2*faces[i].height/3); // creating a blue rectangle around the forehead 
    //-------------------- storing forehead white rectangle part into an image ------------------- 
    stroke(0, 255, 255); 
    rect(faces[i].x+faces[i].width/2-15, faces[i].y+15, 30, 15); 
    PImage img = video.get(faces[i].x+faces[i].width/2-15, faces[i].y+15, 30, 15); // storing the forehead aera into a image 
    img.loadPixels(); 
    img.filter(GRAY); // converting capture image rgb to gray 
    img.updatePixels(); 

    int numPixels = img.width*img.height; 
    for (int px = 0; px < numPixels; px++) { // For each pixel in the video frame... 
     final color c = img.pixels[px]; 
     final color luminG = c>>010 & 0xFF; 
     final float luminRangeG = luminG/255.0; 
     gavg = gavg + luminRangeG; 
    } 

    //-------------------------------------------------------- 
    gavg = gavg/numPixels; 
    if (poop.size()< bufferSize) { 
     poop.add(gavg); 
    } 
    else poop.remove(0); 
    } 
    sample = new float[poop.size()]; 
    for (int i=0;i<poop.size();i++) { 
    Float f = (float) poop.get(i); 
    sample[i] = f; 
    } 

    if (sample.length>=bufferSize) { 
    //fft.window(FFT.NONE); 
    fft.forward(sample, 0); 
    // bpf = new BandPass(centerFreq, bandwidth, sampleRate); 
    // in.addEffect(bpf); 
    float bw = fft.getBandWidth(); // returns the width of each frequency band in the spectrum (in Hz). 
    println(bw); // returns 21.5332031 Hz for spectrum [0] & [512] 

    for (int i = 0; i < fft.specSize(); i++) 
    { 
     // println(" Freq" + max(sample)); 
     stroke(0, 255, 0); 
     float x = map(i, 0, fft.specSize(), 0, width); 
     line(x, height, x, height - fft.getBand(i)*100); 
    // text("FFT FREQ " + fft.getFreq(i), width/2-100, 10*(i+1)); 
    // text("FFT BAND " + fft.getBand(i), width/2+100, 10*(i+1)); 
    } 
    } 
    else { 
    println(sample.length + " " + poop.size()); 
    } 
} 

void captureEvent(Capture c) { 
    c.read(); 
} 
+0

Это ребята пульс слишком высокий для кого-то просто сидит там ... – GPPK

+0

@depends о том, как голом/неприятном младенце он смотрит на ... – Spektre

ответ

1

БПФ применяется в окне с 128 образцами.

int bufferSize = 128;

Во время метода рисования образцы хранятся в массиве до заполнения буфера для БПФ. Затем буфер сохраняется. Чтобы вставить новый образец, старейший из них удаляется. gavg - средний серый цвет канала.

gavg = gavg/numPixels; 
if (poop.size()< bufferSize) { 
    poop.add(gavg); 
} 
else poop.remove(0); 

Справиться кормы к образцу

sample = new float[poop.size()]; 
for (int i=0;i < poop.size();i++) { 
    Float f = (float) poop.get(i); 
    sample[i] = f; 
} 

Теперь можно применить FFT к образцу составлять список присяжных заседателей

fft.forward(sample, 0); 

В коде показан только результат спектра. Частота сердечного ритма должна быть рассчитана. Для каждой полосы в fft вам необходимо найти максимум, а это положение - частота пульса.

for(int i = 0; i < fft.specSize(); i++) 
     { // draw the line for frequency band i, scaling it up a bit so we can see it 
      heartBeatFrequency = max(heartBeatFrequency,fft.getBand(i)); 
     } 

Тогда получите пропускную способность знать частоту.

float bw = fft.getBandWidth(); 

Регулировка частоты.

heartBeatFrequency = fft.getBandWidth() * heartBeatFrequency;

+0

Hi David, Спасибо за любезный ответ и разработку моего кода. Я добавил ваш предлагаемый фрагмент кода, который вы упомянули в конце своего сообщения. Когда я запускаю код, он дает мне «Бесконечность», можете ли вы рассказать мне, почему это происходит? Еще раз спасибо :) – Ryder

+0

Вы решили? fft.getBandWidth(), heartBeatFrequency, один из которых имеет бесконечное значение. проверьте, инициализирована ли функция heartBeatFrequency с -infinity, и если fft.getBandWidth() возвращает действительное значение, отличное от бесконечности. –

Смежные вопросы