Как обнаружить углы на изображении с помощью 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];
}

2 ответа

Решение

Вы собираетесь вернуть свои углы в массиве:

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

где cornersArray выше приведен массив пар значений GLfloat, которые описывают нормализованные координаты X и Y для каждого угла (размер массива равен cornersDetected * 2). Эти значения нормированы в диапазоне 0,0-1,0.

Если прямоугольник, который вы обрезаете, является прямоугольником, выровненным по всему изображению, вы можете использовать GPUImageCropFilter, чтобы вырезать интересующий прямоугольник на основе этих нормализованных координат.

Однако, скорее всего, вы не получите обратно выровненный прямоугольник. Вот где все становится немного сложнее, потому что вам нужно обрабатывать как поворот, так и перспективу вашего прямоугольника. В настоящее время у меня нет ничего, что делает это, хотя этот вопрос, этот вопрос и этот вопрос описывают математику, которая может быть использована для генерации преобразования, которое можно использовать для создания необходимой вам проекции. Я хотел получить что-то подобное в рамках, но у меня не было времени, чтобы разработать математику для правильного преобразования, чтобы применить к карте от одного произвольного четырехугольника к другому.

Можете ли вы опубликовать документы в GPUImageHarrisCornerDetectionFilter и, в частности, в методе setCornersDetectedBlock?

Обратите внимание, что ваш код, вероятно, не будет работать так, как вы его написали. Мне кажется, что фильтр предназначен для асинхронной работы, поэтому после вызова setCornersDetectedBlock он вернется до того, как станут доступны результаты. Вы, вероятно, поместите код в блок, который обрабатывает результаты определения угла.

Другие вопросы по тегам