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



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

最佳函数将检测角点,使用这些角点裁剪图像,并返回裁剪后的图像(图片中的正方形)。

-(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];
}

你将在一个数组中取回你的角:

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

其中,上述中的cornersArray是描述每个角的归一化X和Y坐标的GLfloat值对的阵列(阵列的大小为cornersDetected*2)。这些值被标准化为0.0-1.0的范围。

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

然而,你很可能不会得到一个对齐的矩形。这就是事情变得更加复杂的地方,因为你需要处理矩形的旋转和透视。我目前没有任何东西可以做到这一点,尽管这个问题,这个问题,以及这个问题描述了可以用来生成变换的数学,可以用来进行你需要的投影。我一直想在框架中加入这样的东西,但还没有时间计算出适用于从一个任意四边形映射到另一个四边形的正确变换的数学表达式。

你能在GPUImageHarrisCornerDetectionFilter上发布文档吗,特别是在setCornersDetectedBlock方法上吗?

请注意,你的代码可能不会像你写的那样工作。在我看来,过滤器是异步运行的,所以在你调用setCornersDetectedBlock后,它会在结果可用之前返回。您可能将代码放入处理拐角检测结果的块中。

最新更新