我想实现名片检测功能,例如此应用程序(https://scanbot.io)。
相机应检测到名片并自动拍照(仅名片)。
我的想法是使用BradLarson's GPUImage
库,检测角点(使用Harris角点检测算法),计算获得的角点最大的矩形并裁剪包含在矩形内的图像。
这是我的代码:
- (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];
}
问题是我不知道如何调整
threshold
和sensibility
属性的属性得到角落(现在我得到了图像中所有对象的角落)。
我也不知道该如何使用
GLfloat* cornerArray
。我不知道我的方法是否正确……关于如何实现此功能的其他任何想法,或者是否有任何现有的库?
谢谢!
最佳答案
了解有关Hough Transform的信息。有了它,您就可以检测线。我敦促您检测直线,然后找到彼此近似成直角的四条线,并选择面积最大的矩形。
步骤将是:
最后:计算机视觉很难……不要指望简单的结果。
附录
我应该注意,上面的步骤3非常简单,因为直线所占的角度只是霍夫空间的一维。因此,平行线在此维度上将具有相等的值,并且正交线将偏移pi或90度。
关于ios - iOS实时确定名片的角落,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26485857/