繁体   English   中英

人脸检测ios7坐标缩放问题

[英]Face Detection ios7 Coordinates Scaling Issue

我正在使用人脸检测API,想知道如何将坐标从大型高分辨率图像转换为UIImageView上显示的较小图像。 到目前为止,我已经反转了图像和容器视图的坐标系,以使其与Core Image坐标系匹配,并且我还计算了高分辨率图像与图像视图的尺寸之间的高度比,但是我得到的坐标根本不准确。 我假设我不能像我想的那样容易地将点从大图像转换为小图像。 有人可以指出我的错误吗?

[self.shownImageViewer setTransform:CGAffineTransformMakeScale(1,-1)];
[self.view setTransform:CGAffineTransformMakeScale(1,-1)];

//240 x 320
self.shownImageViewer.image = self.imageToShow;

yscale = 320/self.imageToShow.size.height;
xscale = 240/self.imageToShow.size.width;
height = 320;

CIImage *image = [[CIImage alloc] initWithCGImage:[self.imageToShow CGImage]];

CIContext *faceDetectionContext = [CIContext contextWithOptions:nil];
CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:faceDetectionContext options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];

NSArray * features = [faceDetector featuresInImage:image options:@{CIDetectorImageOrientation:[NSNumber numberWithInt:6]}];

for(CIFaceFeature *feature in features)
{
    if(feature.hasLeftEyePosition)
        self.leftEye = feature.leftEyePosition;
    if(feature.hasRightEyePosition)
        self.rightEye = feature.rightEyePosition;
    if(feature.hasMouthPosition)
        self.mouth = feature.mouthPosition;
}

NSLog(@"%g and %g",xscale*self.rightEye.x, yscale*self.rightEye.y);
NSLog(@"%g and %g",yscale*self.leftEye.x, yscale*self.leftEye.y);
NSLog(@"%g",height);
self.rightEyeMarker.center = CGPointMake(xscale*self.rightEye.x,yscale*self.rightEye.y);
self.leftEyeMarker.center = CGPointMake(xscale*self.leftEye.x,yscale*self.leftEye.y);

我将从您的图像视图中删除转换开始。 只需使图像视图已按其方向显示图像即可。 这将使计算容易得多。

现在, CIFaceFeature在图像坐标中输出其特征。 但是您的imageView可能更大或更小。 因此,首先要保持简单,并将imageView的内容模式设置为左上方。

imageView.contentMode = UIViewContentModeTopLeft;

现在,您根本不必缩放坐标。

当您对此感到满意时,将contentMode设置为更合适的值(例如,宽高比适合)。

imageView.contentMode = UIViewContentModeScaleAspectFit;

现在,您需要通过将每个坐标乘以宽高比来缩放x和y坐标。

 CGFloat xRatio = imageView.frame.size.width / image.size.width;
 CGFloat yRatio = imageView.frame.size.height / image.size.height;
 CGFloat aspectFitRatio = MIN(xRatio, yRatio);

最后,您想重新添加旋转。如果可能的话,请尽量避免这种情况,例如,修复图像,使其从一开始就直立。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM