Détection de la fréquence cardiaque à l'aide de l'appareil photo

J'ai besoin de la même fonctionnalité que l'application Instant Heart Rate .

Le process de base nécessite que l'user:

  1. Placez la pointe de l'index doucement sur l'objective de la camera.
  2. Appliquer une pression uniforme et couvrir l'set de la lentille.
  3. Maintenez-le stable pendant 10 secondes et obtenez la fréquence cardiaque.

Ceci peut être accompli en allumant le flash et regarder la lumière changer comme le sang se déplace à travers l'index.

Comment puis-je get datatables de niveau de lumière à partir de la capture video? Où devrais-je chercher ceci? J'ai regardé à travers la class AVCaptureDevice mais AVCaptureDevice n'ai rien trouvé d'utile.

J'ai également trouvé AVCaptureDeviceSubjectAreaDidChangeNotification , serait-ce utile?

    Regarde ça..

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

    Exemple de code ici

    En fait, peut être simple, vous devez parsingr les valeurs de pixels de l'image capturée. Un algorithm simple serait: sélectionner et aire au centre de l'image, convertir en échelle de gris, get la valeur médiane du pixel pour chaque image et vous obtiendrez une fonction 2D et calculer cette distance entre les minimums et cette fonction ou maximum et problème résolu.

    Si vous regardez l'histogramme des images acquises sur une période de 5 secondes, vous remarquerez les changements de la dissortingbution des niveaux de gris. Si vous voulez un calcul plus robuste, parsingz l'histogramme.

    En remarque, vous pourriez être intéressé par ce document de search . Cette méthode ne nécessite même pas un doigt (ou quoi que ce soit) directement sur l'objective.