实时确定商务名片的角落(iOS)

7
我希望能实现类似于这个应用(https://scanbot.io)的名片检测功能。相机应该可以检测到名片并自动拍摄名片照片(仅限名片)。
我的想法是使用BradLarson的GPUImage库,检测角落(使用哈里斯角检测算法),计算出带有获得角落最大的矩形,并裁剪矩形内包含的图像。
这是我的代码:
 - (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];

}

问题在于我不知道如何调整thresholdsensibility属性,以获取角落(现在我正在获取图像中所有对象的角落)。
我也不知道如何使用这个GLfloat* cornerArray
我不知道我是否正确...对于如何实现这个功能或是否存在任何现有库,有没有其他想法?
谢谢!

你有没有找到使用GPUImage实现这个的方法? - Aaron Bratcher
1个回答

9

了解霍夫变换,通过它可以检测出图像中的直线。建议先检测直线,找到四条大致相互垂直的边界线,然后取面积最大的矩形。

步骤如下:

  1. 使用 Sobel 滤波器进行边缘检测。
  2. 使用 Hough 变换查找图像中的所有直线。
  3. 查看所有平行线和垂直于这些平行线对的所有直线,以找到可能的矩形。
  4. 选择最佳矩形。您可以根据面积、与手机最佳对齐、要求所有边缘都在可见相机图像内或其他方法来选择。

最后:计算机视觉很难......不要期望轻松获得结果。

补充说明

需要注意的是,上述第3个步骤非常简单,因为直线所占的角度是您的 Hough 空间的一个维度。因此,平行线在这个维度上具有相等的值,而正交线则会被向 pi 或 90 度偏移。


我不确定是否有针对此问题的Objective-C或Swift代码示例可用? - Aaron Bratcher
有一个名为OpenCV的库可以在iOS应用程序中使用。OpenCV还具有Hough变换实现。这对你有用吗? - Unapiedra
OP正在使用Brad Larson的GPUImage。它可以在Swift中使用,并且有一些霍夫变换代码可用。这是对GPUImage代码库的grep,但应该先构建lib,然后使用适当的文档。 - Unapiedra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接