iOS实时确定名片的角落

时间:2014-10-21 11:42:35

标签: ios image-processing crop detection gpuimage

我想实现名片检测功能,例如此应用(https://scanbot.io)。 相机应该检测到一张名片并自动拍照(只有名片)。

image is delimited by the green lines

我的想法是使用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];

}

问题是我不知道如何调整thresholdsensibility属性的属性 获得角落(现在我正在为图像中的所有对象找到角落)。

我也不知道如何使用此GLfloat* cornerArray

我不知道我是否采用正确的方式......关于如何实现此功能的任何其他想法,还是现有的库?

谢谢!

1 个答案:

答案 0 :(得分:9)

了解Hough Transform。有了它,你可以检测线条。我会敦促你检测直线,然后发现四条线彼此大致成直角,并采用最大面积的矩形。

步骤如下:

  1. 使用Sobel滤波器进行边缘检测。
  2. Hough变换以查找图像中的所有直线。
  3. 查看所有平行线,然后查看与这些平行线对成90度的所有线,以找到可能的矩形。
  4. 选择您最喜欢的矩形。这可以是按区域,也可以是最好与手机对齐,或者您要求所有边缘都在可见的相机图像内,或其他方法。
  5. 最后:计算机视觉很难......不要期待轻松的结果。

    附录

    我应该注意上面的第3步非常简单,因为线条的角度只是你的霍夫空间的一个维度。因此,平行线在此维度中将具有相等的值,并且正交线将移位pi或90度。