tarjetas que presentacion para mac hacer app ios image-processing crop detection gpuimage

que - iOS Determine las esquinas de una tarjeta de visita en tiempo real



arkit 2.0 download (1)

Lea acerca de 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 tome el rectángulo con el área más grande.

Los pasos serían:

  1. Detección de bordes con el filtro Sobel.
  2. Hough transform para encontrar todas las líneas rectas en la imagen.
  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 rectángulos.
  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 necesita que todos los bordes estén dentro de la imagen visible de la cámara o algún otro método.

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

Apéndice

Debo señalar 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 en pi o 90 grados.

Quiero implementar una funcionalidad para detectar tarjetas de visita como esta aplicación ( https://scanbot.io ). La cámara debe detectar una tarjeta de presentación y tomarla automáticamente (solo la tarjeta de negocios).

Mi idea era usar BradLarson''s GPUImage biblioteca BradLarson''s GPUImage , detectar las esquinas (usando el algoritmo de detección de esquina Harris), calcular el rectángulo más grande con las esquinas obtenidas y recortar la imagen 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 atributos de sensibility para obtener las esquinas (ahora obtengo las esquinas de todos los objetos de la imagen).

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

No sé si estoy en el camino correcto ... ¿alguna otra idea sobre cómo implementar esta funcionalidad o si hay alguna biblioteca existente?

¡Gracias!