Ale*_*Ale 7 crop image-processing detection ios gpuimage
我想实现一个名片检测功能,如这个应用程序(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];
}
Run Code Online (Sandbox Code Playgroud)
问题是我不知道如何调整属性threshold和sensibility属性来获得角落(现在我正在获取图像中所有对象的角落).
我也不知道如何使用它GLfloat* cornerArray.
我不知道我是否正确的方式...关于如何实现此功能的任何其他想法,还是有任何现有的库?
谢谢!
阅读Hough Transform.有了它,你可以检测线条.我会敦促你检测直线,然后发现四条线彼此大致成直角,并采用最大面积的矩形.
步骤将是:
最后:计算机视觉很难......不要指望轻松的结果.
我应该注意上面的第3步非常简单,因为线条所采用的角度只是霍夫空间的一个维度.因此,平行线在此维度中将具有相等的值,并且正交线将移位pi或90度.