Перейти к содержимому


Определение лиц


В теме одно сообщение

#1 ILYA2606

ILYA2606

    Участник

  • Developer
  • 22 сообщений
  • Гаджет:iPhone 4S
  • ОС:OS X

Отправлено 26 Апрель 2012 - 00:50

Изображение


Функция определения лиц от Apple появилась только в iOS SDK 5.0, сообтветственно для тестирования приведенного ниже примера необходима iOS 5.0 или выше.
Ниже будет пример определения лиц(а также глаз и рта) на заложенной ранее фотографии.
Итак, приступим.

Добавляем в приложение CoreImage.framework, подключаем хидер:
#import <[b]CoreImage/[b]CoreImage.h[/b][/b]>
Запускаем метод faceDetector
[self faceDetector];
Сам этот метод берет изображение из проекта и посылает его функции, которая обрабатывает изображение.
-(void)faceDetector
{
	// Загрузка изображения для определения лица
	UIImageView* image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.jpg"]];

	// Добавляем изображение в окно
	[self.window addSubview:image];

	// Запускаем мотед markFaces в фоновом режиме
	[self performSelectorInBackground:@selector(markFaces:) withObject:image];

	// Переворачиваем изображение по оси Y для корректного отображения
	[image setTransform:CGAffineTransformMakeScale(1, -1)];

	// Переворачиваем окно по оси Y для корректного отображения
	[self.window setTransform:CGAffineTransformMakeScale(1, -1)];
}
Метод markFaces: получает исходное изображение и обрабатывает его, добавляя контуры лица, глаз и рта, которые были обнаружены.
-(void)markFaces:(UIImageView *)facePicture
{
	// Рисуем CI-изображение из ранее загруженного изображения для распознавания лица
	CIImage* image = [CIImage imageWithCGImage:facePicture.image.CGImage];

	// Создаем распознаватель лица, выставляем ему высокую точность, пренебрегая временем выполнения
	CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace
											  context:nil options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]];

	// Создаем массив, содержащий все обнаруженные лица от детектора
	NSArray* features = [detector featuresInImage:image];

	// Будем повторять каждое обнаруженное лицо. CIFaceFeature дает нам ширину для всего лица, а также координаты для каждого глаза и рта, если они были обнаружены. Кроме того, предоставляется BOOL для глаз и рта, чтобы мы могли проверить существуют ли они.
	for(CIFaceFeature* faceFeature in features)
	{
		// Получаем ширину лица
		CGFloat faceWidth = faceFeature.bounds.size.width;

		// Создаем UIView по размерам лица
		UIView* faceView = [[UIView alloc] initWithFrame:faceFeature.bounds];

		// добавляем рамку к UIView
		faceView.layer.borderWidth = 1;
		faceView.layer.borderColor = [[UIColor redColor] CGColor];

		// добавляем UIView в окно
		[self.window addSubview:faceView];

		if(faceFeature.hasLeftEyePosition)
		{
			// Создаем UIView по размеру левого глаза
			UIView* leftEyeView = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.leftEyePosition.x-faceWidth*0.15, faceFeature.leftEyePosition.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)];
			// Меняем фон на синий
			[leftEyeView setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]];
			// Устанавливаем правильную позицию, где находится левый глаз
			[leftEyeView setCenter:faceFeature.leftEyePosition];
			// Закругляем углы
			leftEyeView.layer.cornerRadius = faceWidth*0.15;
			// Добавляем к окну
			[self.window addSubview:leftEyeView];
		}

		if(faceFeature.hasRightEyePosition)
		{
			// Создаем UIView по размеру правого глаза
			UIView* rightEye = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.rightEyePosition.x-faceWidth*0.15, faceFeature.rightEyePosition.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)];
			// Меняем фон на синий
			[rightEye setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]];
			// Устанавливаем правильную позицию, где находится правый глаз
			[rightEye setCenter:faceFeature.rightEyePosition];
			// Закругляем углы
			rightEye.layer.cornerRadius = faceWidth*0.15;
			// Добавляем к окну
			[self.window addSubview:rightEye];
		}

		if(faceFeature.hasMouthPosition)
		{
			// Создаем UIView по размеру рта
			UIView* mouth = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.mouthPosition.x-faceWidth*0.2, faceFeature.mouthPosition.y-faceWidth*0.2, faceWidth*0.4, faceWidth*0.4)];
			// Меняем фон на зеленый
			[mouth setBackgroundColor:[[UIColor greenColor] colorWithAlphaComponent:0.3]];
			// Устанавливаем правильную позицию, где находится рот
			[mouth setCenter:faceFeature.mouthPosition];
			// Закругляем углы
			mouth.layer.cornerRadius = faceWidth*0.2;
			// Добавляем к окну
			[self.window addSubview:mouth];
		}
	}
}
Вот и все.
Внимание: в примере работает система автоматического контроля над памятью ARC. Если в вышем проекте ARC отключена, то не забудьте очистить память.

Скачать проект


Изображение



Статья подготовлена @ILYA2606


Изображение

#2 Мириам

Мириам

    Новичок

  • Пользователи
  • 9 сообщений
  • Город:Москва
  • Гаджет:iPhone 5s
  • ОС:Windows
  • Прошивка:Lewa OS

Отправлено 03 Ноябрь 2014 - 12:31

Круто, попробую и я эту прогу, реально круто:))))



Ответить



  


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных