如何使用GPUImageHarrisCornerDetectionFilter检测图像上的角点

时间:2014-04-25 22:35:51

标签: ios objective-c gpuimage gpuimagestillcamera

我试图通过检测角落来裁剪其中有正方形的图像。下面的方法试图找到角落,但我不确定如何完成这个过程。有什么想法吗?

最佳功能可以检测角落,使用这些角落裁剪图像,然后返回裁剪后的图像(图片中的方块)。

-(NSArray *)cornersForImage:(UIImage *)inputImage{

    NSMutableArray *results = [NSMutableArray new];

    GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];

    GPUImageHarrisCornerDetectionFilter *cornerFilter1 = [[GPUImageHarrisCornerDetectionFilter alloc] init];
    [cornerFilter1 setThreshold:0.1f];
    [cornerFilter1 forceProcessingAtSize:self.displayImage.frame.size];

    [stillImageSource addTarget:cornerFilter1];
    [stillImageSource processImage];

    [cornerFilter1 setCornersDetectedBlock:^(GLfloat *, NSUInteger, CMTime) {

        //get corners?
    }];
    return [NSArray arrayWithArray:results];
}

2 个答案:

答案 0 :(得分:2)

你将把你的角落放回阵列中:

[(GPUImageHarrisCornerDetectionFilter *)filter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) {
}];

上面的cornersArray是GLfloat值对的数组,描述了每个角的标准化X和Y坐标(数组的大小为cornersDetected * 2)。这些值归一化到0.0-1.0的范围。

如果您要裁剪的矩形是与整个图像对齐的矩形,则可以使用GPUImageCropFilter根据这些标准化坐标裁剪出感兴趣的矩形。

但是,您很可能不会回到对齐的矩形。事情变得复杂一点,因为你需要处理矩形的旋转和透视。虽然this questionthis questionthis one描述了可用于生成可用于投影的变换的数学,但我目前还没有做到这一点的任何事情。你需要。我一直想把这样的东西放到框架中,但是没有时间去研究适当的变换,以适用于从一个任意四边形到另一个四边形的地图。

答案 1 :(得分:1)

您可以在GPUImageHarrisCornerDetectionFilter上发布文档,特别是setCornersDetectedBlock方法吗?

请注意,您的代码可能在您编写代码时无法正常工作。听起来像过滤器被设计为异步运行,因此在调用setCornersDetectedBlock之后,它将在结果可用之前返回。您可能会将代码放在处理角点检测结果的块中。