我试图通过检测角落来裁剪其中有正方形的图像。下面的方法试图找到角落,但我不确定如何完成这个过程。有什么想法吗?
最佳功能可以检测角落,使用这些角落裁剪图像,然后返回裁剪后的图像(图片中的方块)。
-(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];
}
答案 0 :(得分:2)
你将把你的角落放回阵列中:
[(GPUImageHarrisCornerDetectionFilter *)filter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) {
}];
上面的cornersArray
是GLfloat值对的数组,描述了每个角的标准化X和Y坐标(数组的大小为cornersDetected
* 2)。这些值归一化到0.0-1.0的范围。
如果您要裁剪的矩形是与整个图像对齐的矩形,则可以使用GPUImageCropFilter根据这些标准化坐标裁剪出感兴趣的矩形。
但是,您很可能不会回到对齐的矩形。事情变得复杂一点,因为你需要处理矩形的旋转和透视。虽然this question,this question和this one描述了可用于生成可用于投影的变换的数学,但我目前还没有做到这一点的任何事情。你需要。我一直想把这样的东西放到框架中,但是没有时间去研究适当的变换,以适用于从一个任意四边形到另一个四边形的地图。
答案 1 :(得分:1)
您可以在GPUImageHarrisCornerDetectionFilter上发布文档,特别是setCornersDetectedBlock方法吗?
请注意,您的代码可能在您编写代码时无法正常工作。听起来像过滤器被设计为异步运行,因此在调用setCornersDetectedBlock之后,它将在结果可用之前返回。您可能会将代码放在处理角点检测结果的块中。