0

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

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

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

2 回答 2

2

你将把你的角落重新放在一个数组中:

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

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

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

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

于 2014-04-25T23:28:56.293 回答
1

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

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

于 2014-04-25T23:29:13.123 回答