我想实现像这个应用程序这样的名片检测功能(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
and sensibility
属性
获取角点(现在我正在获取图像中所有对象的角点)。
我也不知道如何处理这个GLfloat* cornerArray
.
我不知道我是否走对了路......关于如何实现此功能的任何其他想法或者是否有任何现有的库?
Thanks!
阅读霍夫变换。有了它,您可以检测线条。我强烈建议您检测直线,然后找到四条彼此大致成直角的线,并选取面积最大的矩形。
步骤是:
- 使用 Sobel 滤波器进行边缘检测。
- 霍夫变换找到图像中的所有直线。
- 查看所有平行线,然后查看与这些平行线对成 90 度的所有线,以找到可能的矩形。
- 选择您最喜欢的矩形。这可以通过区域来实现,或者通过与手机最佳对齐来实现,或者您要求所有边缘都位于可见相机图像内,或者采用某种其他方法。
最后:计算机视觉很难......不要指望简单的结果。
Addendum
我应该注意到上面的步骤 3 非常简单,因为angle这些线只是霍夫空间的一维。因此,平行线在此维度上将具有相等的值,而正交线将移动 pi 或 90 度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)