菜鸟教程小白 发表于 2022-12-12 22:38:46

ios - 将 CIDetector(人脸检测)结果转换为 UIImageView 坐标


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

<p>我查看了这里的所有问题以及我能找到的所有教程,其中大多数使用在 UIImageView (<a href="http://nacho4d-nacho4d.blogspot.com/2012/03/coreimage-and-uikit-coordinates.html" rel="noreferrer noopener nofollow">example</a>) 中显示时未缩放的小图像。 <strong>我遇到的问题是使用在 UIImageView 中显示时使用 <code>aspectFit</code> 缩放的大图像并确定正确的比例 + 平移值。</strong></p>

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

<p>我在做什么:</p>

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

<p>//我确定变换值的例程</p>

<pre><code>NSDictionary* data = ;

CGRect scaledImageBounds = CGRectFromString();
float scale = [ floatValue];

CGAffineTransform transform = CGAffineTransformMakeScale(scale, -scale);

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

<p>CIDetector 结果转换使用:</p>

<pre><code>   mouthPosition = CGPointApplyAffineTransform(mouthPosition, transform);
</code></pre>

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

<p> <img src="/image/XOALo.png" alt="enter image description here"/> </p>

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

<pre><code>-(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 &lt; 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:
                           , @&#34;scale&#34;,
                           NSStringFromCGRect(boundingRect), @&#34;bounds&#34;,
                           nil];

    return data;
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我完全理解你想要做什么,但是让我为你提供一种不同的方式来实现你想要的。</p>

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

<p>CGContextDrawImage(context, CGRectMake(0, offset, imageView.size.width, rintf(image.size.height*scale)), [图像CGImage]);</p></li>
<li><p>使用以下方法获取此新图像:</p>

<p>UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
返回图片;</p></li>
<li><p>设置图片:imageView.image = image;</p></li>
</ul>

<p>现在您可以准确地映射回您的图像,因为您知道确切的缩放比例和偏移量。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 将 CIDetector(人脸检测)结果转换为 UIImageView 坐标,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/12201603/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/12201603/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 将 CIDetector(人脸检测)结果转换为 UIImageView 坐标