Определение частоты сердечных сокращений с помощью камеры - PullRequest
26 голосов
/ 14 февраля 2012

Мне нужна та же функциональность, что и в приложении Мгновенная частота пульса .

Основной процесс требует от пользователя:

  1. Аккуратно положите кончик указательного пальца на объектив камеры.
  2. Приложите равномерное давление и закройте весь объектив.
  3. Удерживайте его в течение 10 секунд и измеряйте частоту сердечных сокращений.

Это можно сделать, включив вспышку и наблюдая за изменением света при движении крови через указательный палец..

Как получить данные об уровне освещенности при захвате видео?Где я должен искать это?Я просмотрел класс AVCaptureDevice, но не нашел ничего полезного.

Я также нашел AVCaptureDeviceSubjectAreaDidChangeNotification, это было бы полезно?

Ответы [ 3 ]

26 голосов
/ 27 марта 2013

Проверьте это ..

// switch on the flash in torch mode  
 if([camera isTorchModeSupported:AVCaptureTorchModeOn]) {  
 [camera lockForConfiguration:nil];  
 camera.torchMode=AVCaptureTorchModeOn;  
 [camera unlockForConfiguration];  
 }  

  [session setSessionPreset:AVCaptureSessionPresetLow];

   // Create the AVCapture Session  
   session = [[AVCaptureSession alloc] init];  

  // Get the default camera device  
   AVCaptureDevice* camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];  
  if([camera isTorchModeSupported:AVCaptureTorchModeOn]) {  
    [camera lockForConfiguration:nil];  
  camera.torchMode=AVCaptureTorchModeOn;  
    [camera unlockForConfiguration];  
 }  
 // Create a AVCaptureInput with the camera device  
    NSError *error=nil;  
     AVCaptureInput* cameraInput = [[AVCaptureDeviceInput alloc] initWithDevice:camera error:&error];  
   if (cameraInput == nil) {  
    NSLog(@"Error to create camera capture:%@",error);  
  }  

    // Set the output  
    AVCaptureVideoDataOutput* videoOutput = [[AVCaptureVideoDataOutput alloc] init];  

   // create a queue to run the capture on  
  dispatch_queue_t captureQueue=dispatch_queue_create("catpureQueue", NULL);  

   // setup our delegate  
   [videoOutput setSampleBufferDelegate:self queue:captureQueue];  

    // configure the pixel format  
    videoOutput.videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber     numberWithUnsignedInt:kCVPixelFormatType_32BGRA], (id)kCVPixelBufferPixelFormatTypeKey,  
     nil];  
   // cap the framerate  
   videoOutput.minFrameDuration=CMTimeMake(1, 10);  
  // and the size of the frames we want  
  [session setSessionPreset:AVCaptureSessionPresetLow];  

   // Add the input and output  
   [session addInput:cameraInput];  
   [session addOutput:videoOutput];  

   // Start the session  

    [session startRunning];  

   - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {  



   // this is the image buffer  

  CVImageBufferRef cvimgRef = CMSampleBufferGetImageBuffer(sampleBuffer);  


   // Lock the image buffer  

  CVPixelBufferLockBaseAddress(cvimgRef,0);  


  // access the data  

  int width=CVPixelBufferGetWidth(cvimgRef);  
  int height=CVPixelBufferGetHeight(cvimgRef);  


  // get the raw image bytes  
  uint8_t *buf=(uint8_t *) CVPixelBufferGetBaseAddress(cvimgRef);  
  size_t bprow=CVPixelBufferGetBytesPerRow(cvimgRef);  


// get the average red green and blue values from the image  

 float r=0,g=0,b=0;  
 for(int y=0; y<height; y++) {  
 for(int x=0; x<width*4; x+=4) {  
  b+=buf[x];  
  g+=buf[x+1];  
  r+=buf[x+2];  
 }  
 buf+=bprow;  
 }  
  r/=255*(float) (width*height);  
  g/=255*(float) (width*height);  
  b/=255*(float) (width*height);  

  NSLog(@"%f,%f,%f", r, g, b);  
  }  

Пример кода Здесь

3 голосов
/ 27 марта 2013

Как примечание, вас может заинтересовать эта статья . Этот метод даже не требует наличия пальца (или чего-либо еще) непосредственно на объективе.

3 голосов
/ 18 мая 2012

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

Если вы посмотрите на гистограмму полученных изображений в течение 5 секунд, вы заметите изменения в распределении уровня серого.Если вы хотите более надежный расчет, проанализируйте гистограмму.

...