我想实现名片检测功能,例如此应用程序(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];

}

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

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

我不知道我的方法是否正确……关于如何实现此功能的其他任何想法,或者是否有任何现有的库?

谢谢!

最佳答案

了解有关Hough Transform的信息。有了它,您就可以检测线。我敦促您检测直线,然后找到彼此近似成直角的四条线,并选择面积最大的矩形。
步骤将是:

  • 使用Sobel过滤器进行边缘检测。
  • Hough变换以查找图像中的所有直线。
  • 查看所有平行线,然后查看与那些平行线对成90度角的所有线,以查找可能的矩形。
  • 选择您最喜欢的矩形。这可以是按面积划分的,也可以是与手机最佳对齐的,或者您要求所有边缘都在可见的相机图像内,或采用其他方法。

  • 最后:计算机视觉很难……不要指望简单的结果。
    附录
    我应该注意,上面的步骤3非常简单,因为直线所占的角度只是霍夫空间的一维。因此,平行线在此维度上将具有相等的值,并且正交线将偏移pi或90度。

    关于ios - iOS实时确定名片的角落,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26485857/

    10-09 08:39