28 Stimmen

Erfassen der Herzfrequenz mit der Kamera

Ich benötige die gleiche Funktionalität wie die Anwendung Sofortige Herzfrequenz .

Das grundlegende Verfahren erfordert vom Benutzer folgende Schritte:

  1. Legen Sie die Spitze des Zeigefingers vorsichtig auf das Kameraobjektiv.
  2. Üben Sie gleichmäßigen Druck aus und bedecken Sie die gesamte Linse.
  3. Halten Sie die Taste 10 Sekunden lang gedrückt und messen Sie die Herzfrequenz.

Dazu schalten Sie den Blitz ein und beobachten, wie sich das Licht verändert, wenn das Blut durch den Zeigefinger fließt.

Wie kann ich die Lichtstärkedaten aus der Videoaufnahme erhalten? Wo sollte ich danach suchen? Ich habe mir die Klasse AVCaptureDevice aber ich habe nichts Nützliches gefunden.

Ich fand auch AVCaptureDeviceSubjectAreaDidChangeNotification wäre das nützlich?

27voto

Sieh dir das an

// 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);  
  }  

Beispiel-Code Hier

3voto

alinoz Punkte 2812

Das kann ganz einfach sein: Sie müssen die Pixelwerte des aufgenommenen Bildes analysieren. Ein einfacher Algorithmus wäre: Wählen Sie einen Bereich in der Mitte des Bildes aus, wandeln Sie ihn in eine Grauskala um, ermitteln Sie den Medianwert des Pixels für jedes Bild und Sie erhalten eine 2D-Funktion, mit der Sie den Abstand zwischen dem Minimum und dem Maximum berechnen können.

Wenn Sie sich das Histogramm der aufgenommenen Bilder über einen Zeitraum von 5 Sekunden ansehen, werden Sie die Veränderungen der Grauwertverteilung feststellen. Wenn Sie eine genauere Berechnung wünschen, analysieren Sie das Histogramm.

3voto

DCS Punkte 3262

Nebenbei bemerkt, könnte Sie Folgendes interessieren dieses Forschungspapier . Bei dieser Methode muss nicht einmal ein Finger (oder etwas anderes) direkt auf das Objektiv gelegt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X