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:
- Detección de bordes con el filtro Sobel.
- Hough transform para encontrar todas las líneas rectas en la imagen.
- 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.
- 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!