gpt4 book ai didi

ios - 将 CIDetector(人脸检测)结果翻译成 UIImageView 坐标

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:49:01 24 4
gpt4 key购买 nike

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

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

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

我在做什么:

  • 获取人脸坐标
  • 使用下面的 frameForImage 例程(在 SO 上找到)获取 UIImageView 图像的比例和边界
  • 为缩放 + 平移创建转换
  • 对 CIDetector 结果应用转换

//我确定变换值的例程

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*)frameForImage:(UIImage*)image inImageViewAspectFit:(UIImageView*)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;
}

最佳答案

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

  • 你的图片尺寸过大
  • 你知道 imageView 的大小
  • 向图像询问其 CGImage
  • 确定一个“比例”因子,即 imageView 宽度除以图像宽度
  • 将这个值乘以你的图像高度,然后从 imageViewHeight 中减去结果,得到 imageView 中的“空”高度,我们称之为“fillHeight”
  • 将“fillHeight”除以 2 并四舍五入得到下面使用的“offset”值
  • 使用 UIGraphicsBeginImageContextWithOptions(imageView.size, NO, 0) 提供的上下文,将背景绘制成任何你想要的颜色,然后绘制你的 CGImage

    CGContextDrawImage (context, CGRectMake(0, offset, imageView.size.width, rintf( image.size.height*scale )), [image CGImage]);

  • 使用以下方法获取此新图像:

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();返回图片;

  • 设置图片:imageView.image = image;

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com