OStack程序员社区-中国程序员成长平台

标题: ios - 将 CIDetector(人脸检测)结果转换为 UIImageView 坐标 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 22:38
标题: ios - 将 CIDetector(人脸检测)结果转换为 UIImageView 坐标

我一直在努力将 CIDetector(面部检测)结果转换为相对于显示图像的 UIImageView 的坐标,以便我可以使用 CGPaths 绘制坐标。

我查看了这里的所有问题以及我能找到的所有教程,其中大多数使用在 UIImageView (example) 中显示时未缩放的小图像。 我遇到的问题是使用在 UIImageView 中显示时使用 aspectFit 缩放的大图像并确定正确的比例 + 平移值。

在使用不同尺寸/长宽比的图像进行测试时,我得到的结果不一致,所以我认为我的程序存在缺陷。我已经为此苦苦挣扎了一段时间,所以如果有人有一些提示或可以对我做错的地方进行 X 光检查,那将是一个很大的帮助。

我在做什么:

//我确定变换值的例程

NSDictionary* data = [self frameForImage:self.imageView.image inImageViewAspectFit:self.imageView];

CGRect scaledImageBounds = CGRectFromString([data objectForKey"bounds"]);
float scale = [[data objectForKey"scale"] floatValue];

CGAffineTransform transform = CGAffineTransformMakeScale(scale, -scale);

transform = CGAffineTransformTranslate(transform, 
          scaledImageBounds.origin.x / scale, 
          -(scaledImageBounds.origin.y / scale + scaledImageBounds.size.height / scale));

CIDetector 结果转换使用:

     mouthPosition = CGPointApplyAffineTransform(mouthPosition, transform);

//错误结果示例:比例尺似乎不正确

enter image description here

//在 SO 上找到的下面的例程,用于确定使用 'aspectFit` 在 UIImageView 中缩放的图像的界限

-(NSDictionary*)frameForImageUIImage*)image inImageViewAspectFitUIImageView*)myImageView
{
    float imageRatio = image.size.width / image.size.height;
    float viewRatio = myImageView.frame.size.width / myImageView.frame.size.height;

    float scale;
    CGRect boundingRect;
    if(imageRatio < viewRatio)
    {
        scale = myImageView.frame.size.height / image.size.height;
        float width = scale * image.size.width;
        float topLeftX = (myImageView.frame.size.width - width) * 0.5;
        boundingRect = CGRectMake(topLeftX, 0, width, myImageView.frame.size.height);
    }
    else
    {
        scale = myImageView.frame.size.width / image.size.width;
        float height = scale * image.size.height;
        float topLeftY = (myImageView.frame.size.height - height) * 0.5;
        boundingRect = CGRectMake(0, topLeftY, myImageView.frame.size.width, height);
    }

    NSDictionary * data = [NSDictionary dictionaryWithObjectsAndKeys:
                           [NSNumber numberWithFloat:scale], @"scale",
                           NSStringFromCGRect(boundingRect), @"bounds",
                           nil];

    return data;
}



Best Answer-推荐答案


我完全理解你想要做什么,但是让我为你提供一种不同的方式来实现你想要的。

现在您可以准确地映射回您的图像,因为您知道确切的缩放比例和偏移量。

关于ios - 将 CIDetector(人脸检测)结果转换为 UIImageView 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12201603/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4