CIDetector неправильно определяет положение лица

70
6

Теперь я знаю, что система координат перепутана. Я попытался изменить вид и imageView, ничего. Затем я попытался изменить координаты на функции, и я все равно получаю ту же проблему. Я знаю, что он обнаруживает лица, глаза и рот, но когда я пытаюсь поместить накладываемые поля из кодов образцов, они не в порядке (точнее, они находятся справа от экрана). Я в тупике, почему это происходит.


Сообщение о некотором коде, потому что я знаю некоторых из вас, ребята, как специфичность:


-(void)faceDetector
{
// Load the picture for face detection
// UIImageView* image = [[UIImageView alloc] initWithImage:mainImage];
[self.imageView setImage:mainImage];
[self.imageView setUserInteractionEnabled:YES];

// Draw the face detection image
// [self.view addSubview:self.imageView];

// Execute the method used to markFaces in background
// [self performSelectorInBackground:@selector(markFaces:) withObject:self.imageView];

// flip image on y-axis to match coordinate system used by core image
// [self.imageView setTransform:CGAffineTransformMakeScale(1, -1)];

// flip the entire window to make everything right side up
// [self.view setTransform:CGAffineTransformMakeScale(1, -1)];

// [toolbar setTransform:CGAffineTransformMakeScale(1, -1)];
[toolbar setFrame:CGRectMake(0, 0, 320, 44)];

// Execute the method used to markFaces in background
[self performSelectorInBackground:@selector(markFaces:) withObject:_imageView];
// [self markFaces:self.imageView];
}

-(void)markFaces:(UIImageView *)facePicture
{
// draw a CI image with the previously loaded face detection picture
CIImage* image = [CIImage imageWithCGImage:facePicture.image.CGImage];

// create a face detector - since speed is not an issue we'll use a high accuracy
// detector
CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace
context:nil options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]];

// CGAffineTransform transform = CGAffineTransformMakeScale(1, -1);
CGAffineTransform transform = CGAffineTransformMakeScale(self.view.frame.size.width/mainImage.size.width, -self.view.frame.size.height/mainImage.size.height);
transform = CGAffineTransformTranslate(transform, 0, -self.imageView.bounds.size.height);

// create an array containing all the detected faces from the detector
NSDictionary* imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:6] forKey:CIDetectorImageOrientation];
NSArray* features = [detector featuresInImage:image options:imageOptions];
// NSArray* features = [detector featuresInImage:image];

NSLog(@"Marking Faces: Count: %d", [features count]);

// we'll iterate through every detected face. CIFaceFeature provides us
// with the width for the entire face, and the coordinates of each eye
// and the mouth if detected. Also provided are BOOL for the eye and
// mouth so we can check if they already exist.
for(CIFaceFeature* faceFeature in features)
{

// create a UIView using the bounds of the face
// UIView* faceView = [[UIView alloc] initWithFrame:faceFeature.bounds];
CGRect faceRect = CGRectApplyAffineTransform(faceFeature.bounds, transform);

// get the width of the face
// CGFloat faceWidth = faceFeature.bounds.size.width;
CGFloat faceWidth = faceRect.size.width;

// create a UIView using the bounds of the face
UIView *faceView = [[UIView alloc] initWithFrame:faceRect];

// add a border around the newly created UIView
faceView.layer.borderWidth = 1;
faceView.layer.borderColor = [[UIColor redColor] CGColor];

// add the new view to create a box around the face
[self.imageView addSubview:faceView];
NSLog(@"Face -> X: %f, Y: %f, W: %f, H: %f",faceRect.origin.x, faceRect.origin.y, faceRect.size.width, faceRect.size.height);

if(faceFeature.hasLeftEyePosition)
{

// create a UIView with a size based on the width of the face
CGPoint leftEye = CGPointApplyAffineTransform(faceFeature.leftEyePosition, transform);
UIView* leftEyeView = [[UIView alloc] initWithFrame:CGRectMake(leftEye.x-faceWidth*0.15, leftEye.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)];
// change the background color of the eye view
[leftEyeView setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]];
// set the position of the leftEyeView based on the face
[leftEyeView setCenter:leftEye];
// round the corners
leftEyeView.layer.cornerRadius = faceWidth*0.15;
// add the view to the window
[self.imageView addSubview:leftEyeView];
NSLog(@"Has Left Eye -> X: %f, Y: %f",leftEye.x, leftEye.y);
}

if(faceFeature.hasRightEyePosition)
{

// create a UIView with a size based on the width of the face
CGPoint rightEye = CGPointApplyAffineTransform(faceFeature.rightEyePosition, transform);
UIView* leftEye = [[UIView alloc] initWithFrame:CGRectMake(rightEye.x-faceWidth*0.15, rightEye.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)];
// change the background color of the eye view
[leftEye setBackgroundColor:[[UIColor yellowColor] colorWithAlphaComponent:0.3]];
// set the position of the rightEyeView based on the face
[leftEye setCenter:rightEye];
// round the corners
leftEye.layer.cornerRadius = faceWidth*0.15;
// add the new view to the window
[self.imageView addSubview:leftEye];
NSLog(@"Has Right Eye -> X: %f, Y: %f", rightEye.x, rightEye.y);
}

// if(faceFeature.hasMouthPosition)
// {
// // create a UIView with a size based on the width of the face
// UIView* mouth = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.mouthPosition.x-faceWidth*0.2, faceFeature.mouthPosition.y-faceWidth*0.2, faceWidth*0.4, faceWidth*0.4)];
// // change the background color for the mouth to green
// [mouth setBackgroundColor:[[UIColor greenColor] colorWithAlphaComponent:0.3]];
// // set the position of the mouthView based on the face
// [mouth setCenter:faceFeature.mouthPosition];
// // round the corners
// mouth.layer.cornerRadius = faceWidth*0.2;
// // add the new view to the window
// [self.imageView addSubview:mouth];
// }
}
}


Я знаю, что сегмент кода немного длинный, но это основной его смысл. Они относятся только к тому, что у меня есть UIImagePickerController, который дает пользователю возможность выбрать существующее изображение или взять новый. Затем изображение устанавливается в UIImageView экрана, который будет отображаться вместе с различными полями и кругами, но не повезло показать их:/


Любая помощь будет оценена по достоинству. Спасибо ~


Update:


Ive добавила фотографию того, что она делает сейчас, так что вы, ребята, можете иметь представление, ive применила новое масштабирование, которое работает немного лучше, но нигде рядом с тем, что я хочу сделать.


Wrong face and eye placement

спросил(а) 2013-05-14T20:36:00+04:00 7 лет, 5 месяцев назад
1
Решение
59

Просто используйте код из приложения Apple SquareCam. Он правильно выравнивает квадрат в любой ориентации как для передней, так и для задней камеры. Интерполируйте вдоль лицаРад для правильного положения глаз и рта. Примечание: вам нужно поменять положение x на позицию y из функции лица. Не знаете, почему именно вам нужно сделать своп, но это дает вам правильные позиции.

ответил(а) 2013-05-22T01:11:00+04:00 7 лет, 5 месяцев назад
71

В вашем преобразовании отсутствует масштаб, если ваше изображение не имеет тот же размер, что и ваше изображение. Начните с


   CGAffineTransformMakeScale( viewWidth / imageWidth, - viewHeight / imageHeight )

где viewWidth и viewHeight - размер вашего представления, а imageWidth и imageHeight - размер вашего изображения.

ответил(а) 2013-05-14T21:58:00+04:00 7 лет, 5 месяцев назад
41

Итак, после игры и с помощью @Sven, я понял это.


CGAffineTransform transform = CGAffineTransformMakeScale(self.imageView.bounds.size.width/mainImage.size.width, -self.imageView.bounds.size.height/mainImage.size.height);
transform = CGAffineTransformRotate(transform, degreesToRadians(270));

Мне пришлось корректировать преобразование, которое нужно масштабировать. b.w размер изображения и размер изображения, а затем по какой-то причине мне пришлось вращать его, но он отлично работает сейчас

ответил(а) 2013-05-23T18:55:00+04:00 7 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема