使用相机检测心率

我需要与应用程序即时心率相同的function。

基本过程要求用户:

  1. 将食指尖轻轻放在相机镜头上。
  2. 施加均匀的压力并覆盖整个镜头。
  3. 保持稳定10秒钟,并获得心率。

这可以通过打开闪光灯并在血液通过食指移动时观察光线变化来完成。

如何从video捕获获取光照水平数据? 我应该在哪里找这个? 我通过类AVCaptureDevice但没有发现任何有用的东西。

我也发现AVCaptureDeviceSubjectAreaDidChangeNotification ,会有用吗?

看看这个..

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

示例代码 在这里

实际上可以很简单,你必须分析捕获的图像的像素值。 一个简单的algorithm是:在图像的中心select和区域,转换为灰度,得到每个图像的像素的中间值,你将最终得到一个二维函数,并在这个函数计算的距离之间的最小值或最大限度地解决问题。

如果您在5秒的时间内查看获取图像的直方图,您将注意到灰度分布的变化。 如果你想要更强大的计算分析直方图。

作为一个方面的说明,你可能会对这篇研究论文感兴趣。 这种方法甚至不需要手指(或任何东西)直接在镜头上。