iOS实时确定名片的angular落

我想要实现一个名片检测function像这个应用程序( https://scanbot.io )。 照相机应检测名片并自动拍照(仅限名片)。

图像由绿线分隔

我的想法是使用BradLarson's GPUImage库,检测angular落(使用哈里斯angular点检测algorithm),计算矩形的最大矩形,裁剪包含在矩形内的图像。

这是我的代码:

  - (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属性来获得angular落(现在我得到的图像中的所有对象的angular落)。

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

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

谢谢!

阅读Hough变换 。 有了它,你可以检测线条。 我会敦促你检测直线,然后find四条直线相互接近的直线,并选取最大面积的矩形。

步骤是:

  1. 使用Sobel滤波器的边缘检测。
  2. Hough变换来查找图像中的所有直线。
  3. 查看所有平行线,然后查看所有平行线对的90度线,find可能的矩形。
  4. select你最喜欢的矩形。 这可能是按区域划分的,也可能是与手机最佳alignment,或者您要求所有边缘都位于可见摄像机图像内或其他方法。

最后:计算机视觉很难…不要期待简单的结果。

附录

我应该注意到上面的步骤3非常简单,因为线的angular度只是你的Hough空间的一个维度。 所以平行线在这个维上有相同的值,而正交线将被移动π或90度。