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]; }
问题是我不知道如何调整属性的threshold
和sensibility
属性来获得angular落(现在我得到的图像中的所有对象的angular落)。
我也不知道如何使用这个GLfloat* cornerArray
。
我不知道我是否在正确的方式…有关如何实现此function的任何其他想法,或者是否有任何现有的库?
谢谢!
阅读Hough变换 。 有了它,你可以检测线条。 我会敦促你检测直线,然后find四条直线相互接近的直线,并选取最大面积的矩形。
步骤是:
- 使用Sobel滤波器的边缘检测。
- Hough变换来查找图像中的所有直线。
- 查看所有平行线,然后查看所有平行线对的90度线,find可能的矩形。
- select你最喜欢的矩形。 这可能是按区域划分的,也可能是与手机最佳alignment,或者您要求所有边缘都位于可见摄像机图像内或其他方法。
最后:计算机视觉很难…不要期待简单的结果。
附录
我应该注意到上面的步骤3非常简单,因为线的angular度只是你的Hough空间的一个维度。 所以平行线在这个维上有相同的值,而正交线将被移动π或90度。