- Я начинаю с
imageView.image
(фото). - Я отправляю (POST)
imageView.image
в удаленную службу (Microsoft Face Detection) для обработки. - Удаленная служба возвращает JSON из
CGRect
для каждого обнаруженного лица на изображении. - Я загружаю JSON в свой UIView, чтобы рисовать прямоугольники. Я запускаю свой UIView с кадра
{0, 0, imageView.image.size.width, imageView.image.size.height}
. ‹- на мой взгляд, рамка, эквивалентная размеруimageView.image
- Добавить мой UIView как подвид
self.imageView
ИЛИself.view
(пробовал оба)
Конечный результат: прямоугольники нарисованы, но они не отображаются правильно на imageView.image
. То есть CGRects, сгенерированные для каждой из граней, должны относиться к координатному пространству изображения, возвращенному удаленной службой, но они не отображаются, как только я добавляю свое пользовательское представление.
Я считаю, что у меня может быть какая-то проблема с масштабированием, поскольку, если я разделю каждое значение в CGRects / 2 (в качестве теста), я могу получить приблизительное значение, но все равно отключено. В документации Microsoft указано, что обнаруженные лица возвращаются с прямоугольниками, указывающими расположение лиц на изображении в пикселях. Но разве они не рассматриваются как точки при рисовании моего пути?
Кроме того, не следует ли мне начинать свое представление с кадра, эквивалентного кадру imageView.image
, чтобы вид соответствовал тому же координатному пространству, что и отправленное изображение?
Вот пример скриншота того, как это будет выглядеть, если я попытаюсь уменьшить каждый CGRect, разделив их на 2.
Я новичок в iOS и отказался от книг, чтобы поработать над этим в качестве самостоятельного упражнения. При необходимости я могу предоставить больше кода. Заранее благодарим за понимание!
ИЗМЕНИТЬ 1
Я добавляю подпредставление для каждого прямоугольника, перебирая массив атрибутов лица, которые включают прямоугольник для каждого лица, с помощью следующего метода, который вызывается во время (void)viewDidAppear:(BOOL)animated
- (void)buildFaceRects {
// build an array of CGRect dicts off of JSON returned from analized image
NSMutableArray *array = [self analizeImage:self.imageView.image];
// enumerate over array using block - each obj in array represents one face
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// build dictionary of rects and attributes for the face
NSDictionary *json = [NSDictionary dictionaryWithObjectsAndKeys:obj[@"attributes"], @"attributes", obj[@"faceId"], @"faceId", obj[@"faceRectangle"], @"faceRectangle", nil];
// initiate face model object with dictionary
ZGCFace *face = [[ZGCFace alloc] initWithJSON:json];
NSLog(@"%@", face.faceId);
NSLog(@"%d", face.age);
NSLog(@"%@", face.gender);
NSLog(@"%f", face.faceRect.origin.x);
NSLog(@"%f", face.faceRect.origin.y);
NSLog(@"%f", face.faceRect.size.height);
NSLog(@"%f", face.faceRect.size.width);
// define frame for subview containing face rectangle
CGRect imageRect = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
// initiate rectange subview with face info
ZGCFaceRectView *faceRect = [[ZGCFaceRectView alloc] initWithFace:face frame:imageRect];
// add view as subview of imageview (?)
[self.imageView addSubview:faceRect];
}];
}
ИЗМЕНИТЬ 2:
/* Image info */
UIImageView *iv = self.imageView;
UIImage *img = iv.image;
CGImageRef CGimg = img.CGImage;
// Bitmap dimensions [pixels]
NSUInteger imgWidth = CGImageGetWidth(CGimg);
NSUInteger imgHeight = CGImageGetHeight(CGimg);
NSLog(@"Image dimensions: %lux%lu", imgWidth, imgHeight);
// Image size pixels (size * scale)
CGSize imgSizeInPixels = CGSizeMake(img.size.width * img.scale, img.size.height * img.scale);
NSLog(@"image size in Pixels: %fx%f", imgSizeInPixels.width, imgSizeInPixels.height);
// Image size points
CGSize imgSizeInPoints = img.size;
NSLog(@"image size in Points: %fx%f", imgSizeInPoints.width, imgSizeInPoints.height);
// Calculate Image frame (within imgview) with a contentMode of UIViewContentModeScaleAspectFit
CGFloat imgScale = fminf(CGRectGetWidth(iv.bounds)/imgSizeInPoints.width, CGRectGetHeight(iv.bounds)/imgSizeInPoints.height);
CGSize scaledImgSize = CGSizeMake(imgSizeInPoints.width * imgScale, imgSizeInPoints.height * imgScale);
CGRect imgFrame = CGRectMake(roundf(0.5f*(CGRectGetWidth(iv.bounds)-scaledImgSize.width)), roundf(0.5f*(CGRectGetHeight(iv.bounds)-scaledImgSize.height)), roundf(scaledImgSize.width), roundf(scaledImgSize.height));
// initiate rectange subview with face info
ZGCFaceRectView *faceRect = [[ZGCFaceRectView alloc] initWithFace:face frame:imgFrame];
// add view as subview of image view
[iv addSubview:faceRect];
}];