iOS Determina las esquinas de una tarjeta de visita en time real

Quiero implementar una tarjeta de negocios que detecte funcionalidades como esta aplicación ( https://scanbot.io ). La camera debe detectar una tarjeta comercial y tomar automáticamente una foto (solo la tarjeta comercial).

la imagen está delimitada por las líneas verdes

Mi idea era utilizar BradLarson's GPUImage librería BradLarson's GPUImage , detectar las esquinas (utilizando el algorithm de detección de esquinas de Harris), calcular el rectángulo más grande con las esquinas obtenidas y recortar la image contenida dentro del rectángulo.

Aquí está mi código:

  - (void)setupFilter { videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; filter = [[GPUImageHarrisCornerDetectionFilter alloc] init]; [(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:0.01f]; [(GPUImageHarrisCornerDetectionFilter *)filter setSensitivity:0.5f]; [(GPUImageHarrisCornerDetectionFilter *)filter setBlurRadiusInPixels:2.0f]; [videoCamera addTarget:filter]; videoCamera.runBenchmark = YES; GPUImageView *filterview = [[GPUImageView alloc] init]; self.view=filterview; GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init]; crosshairGenerator.crosshairWidth = 22.0; [crosshairGenerator forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; [(GPUImageHarrisCornerDetectionFilter *)filter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) { [crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime]; }]; GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; [blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)]; GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc] init]; [videoCamera addTarget:gammaFilter]; [gammaFilter addTarget:blendFilter]; [crosshairGenerator addTarget:blendFilter]; [blendFilter addTarget:filterview]; [videoCamera startCameraCapture]; } 

El problema es que no sé cómo ajustar la propiedad del threshold y los attributes de sensibility para get las esquinas (ahora estoy recibiendo las esquinas de todos los objects en la image).

Tampoco sé cómo trabajar con este GLfloat* cornerArray .

No sé si estoy en el path correcto … ¿Alguna otra idea sobre cómo implementar esta funcionalidad o existe alguna biblioteca existente?

¡Gracias!

Lee sobre Hough Transform . Con él, puedes detectar líneas. Le insto a que detecte líneas rectas y luego encuentre cuatro líneas que están aproximadamente en ángulo recto entre sí y toman el rectángulo con el área más grande.

Los pasos serían:

  1. Detección de bordes usando el filter Sobel.
  2. Hough transforma para encontrar todas las líneas rectas en la image.
  3. Mire todas las líneas paralelas y luego todas las líneas 90 grados a esos pares de líneas paralelas, para encontrar posibles rectangularjs.
  4. Elige el rectángulo que más te guste. Esto podría ser por área, o por estar mejor alineado con el teléfono, o requiere que todos los bordes estén dentro de la image de la camera visible, u otro método.

Por último: Computer Vision es difícil … no esperes resultados fáciles.

Apéndice

Debo notar que el paso 3 anterior es muy simple, porque el ángulo que toman las líneas es simplemente una dimensión de tu espacio Hough. Entonces, las líneas paralelas tendrán en esta dimensión valores iguales, y las líneas ortogonales se desplazarán por pi o 90 grados.