Обнаружение поверхностей в изображении

Базовое Изображение может проанализировать и найти человеческие поверхности в изображении. Это выполняет обнаружение поверхности, не распознавание. Обнаружение поверхности является идентификацией прямоугольников, содержащих человеческие функции поверхности, тогда как распознавание лиц является идентификацией определенных человеческих поверхностей (Джон, Мэри, и т.д.). После того, как Базовое Изображение обнаруживает поверхность, оно может предоставить информацию о функциях поверхности, таких как позиции рта и глаз. Это может также отследить позицию идентифицированная поверхность в видео.

  Изображение Ядра рисунка 2-1 идентифицирует границы поверхности в изображении

Знание, где поверхности находятся в изображении, позволяет Вам выполнить другие операции, такие как обрезка или корректировка качества изображения поверхности (тональный баланс, исправление красного глаза и т.д.). Можно также выполнить другие интересные операции на поверхностях; например:

Обнаружение поверхностей

Используйте CIDetector класс для нахождения поверхностей в изображении как показано в Перечислении 2-1.

Перечисление 2-1  , Создающее детектор поверхности

CIContext *context = [CIContext contextWithOptions:nil];                    // 1
NSDictionary *opts = @{ CIDetectorAccuracy : CIDetectorAccuracyHigh };      // 2
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace
                                          context:context
                                          options:opts];                    // 3
 
opts = @{ CIDetectorImageOrientation :
          [[myImage properties] valueForKey:kCGImagePropertyOrientation] }; // 4
NSArray *features = [detector featuresInImage:myImage options:opts];        // 5

Вот то, что делает код:

  1. Создает контекст; в этом примере, контексте для iOS. Можно использовать любую из функций создания контекста, описанных в Обработке Изображений.) У Вас также есть опция предоставления nil вместо контекста, когда Вы создаете детектор.)

  2. Создает словарь опций для указания точности для детектора. Можно указать низкую точность или высокую точность. Низкая точность (CIDetectorAccuracyLow) быстро; высокая точность, показанная в этом примере, полна, но медленнее.

  3. Создает детектор для поверхностей. Единственный тип детектора, который можно создать, один для человеческих поверхностей.

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

  5. Использует детектор для нахождения функций в изображении. Изображение, которое Вы обеспечиваете, должно быть a CIImage объект. Базовое Изображение возвращает массив CIFeature объекты, каждый из которых представляет поверхность в изображении.

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

Получение границ функции поверхности и поверхности

Функции поверхности включают:

После того, как Вы получаете массив функций поверхности от a CIDetector объект, можно циклично выполниться через массив для исследования границ каждой поверхности и каждой функции в поверхностях, как показано в Перечислении 2-2.

Перечисление 2-2  , Исследующее границы функции поверхности

for (CIFaceFeature *f in features)
{
    NSLog(NSStringFromRect(f.bounds));
 
    if (f.hasLeftEyePosition)
        NSLog("Left eye %g %g", f.leftEyePosition.x. f.leftEyePosition.y);
 
    if (f.hasRightEyePosition)
        NSLog("Right eye %g %g", f.rightEyePosition.x. f.rightEyePosition.y);
 
    if (f.hasmouthPosition)
        NSLog("Mouth %g %g", f.mouthPosition.x. f.mouthPosition.y);
}