- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
再一次,我很接近,但没有香蕉。
我正在尝试学习一些关于面部识别的教程。使用以下代码几乎就可以了,但我认为在缩放和在面部周围放置 UIImageView
边框方面我缺少一些东西。
我在照片库中的照片大小不同(出于某些无法解释的原因),所以我想 CIDetector
正在寻找人脸,我正在应用 CGAffineTransforms
等,并尝试将它们放在 UIImageView
中。但是,正如您从图像(也在下方)中看到的那样,它没有绘制在正确的位置。
UIImageView
为 280x500 并设置为 Scale to Fill。
任何帮助弄清楚正在发生的事情都会很棒!
-(void)detectFaces {
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *image = [CIImage imageWithCGImage:_imagePhotoChosen.image.CGImage options:nil];
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace context:context options:@{CIDetectorAccuracy : CIDetectorAccuracyHigh}];
CGAffineTransform transform = CGAffineTransformMakeScale(1, -1);
transform = CGAffineTransformTranslate(transform, 0, -_imagePhotoChosen.image.size.height);
NSArray *features = [detector featuresInImage:image];
NSLog(@"I have found %lu faces", (long unsigned)features.count);
for (CIFaceFeature *faceFeature in features)
{
const CGRect faceRect = CGRectApplyAffineTransform(faceFeature.bounds, transform);
NSLog(@"I have the original frame as: %@", NSStringFromCGRect(faceRect));
const CGFloat scaleWidth = _imagePhotoChosen.frame.size.width/_imagePhotoChosen.image.size.width;
const CGFloat scaleHeight = _imagePhotoChosen.frame.size.height/_imagePhotoChosen.image.size.height;
CGRect faceFrame = CGRectMake(faceRect.origin.x * scaleWidth, faceRect.origin.y * scaleHeight, faceRect.size.width * scaleWidth, faceRect.size.height * scaleHeight);
UIView *faceView = [[UIView alloc] initWithFrame:faceFrame];
NSLog(@"I have the bounds as: %@", NSStringFromCGRect(faceFrame));
faceView.layer.borderColor = [[UIColor redColor] CGColor];
faceView.layer.borderWidth = 1.0f;
[self.view addSubview:faceView];
}
}
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
_imagePhotoChosen.image = info[UIImagePickerControllerOriginalImage];
//[_imagePhotoChosen sizeToFit];
[self.view addSubview:_viewChosenPhoto];
[picker dismissViewControllerAnimated:YES completion:nil];
[self detectFaces];
}
我已经留在 NSLog 语句中,因为我一直在尝试计算数学是否错误,但似乎无法确定它是否正确!而且我也是一名数学老师......叹息....
再次感谢您为我指明正确方向所做的一切。
作为对想知道我是如何解决它的人的回应......这对我来说真的是一个愚蠢的错误。
我将 subview 添加到主窗口,而不是 UIImageView
。因此我删除了这一行:
[self.view addSubview:faceView];
并将其替换为:
[_imagePhotoChosen addSubview:faceView];
这样就可以将框架放置在正确的位置。公认的解决方案为我提供了线索!所以,更新后的代码(从那以后我又做了一些改动)变成了:
-(void)detectFaces:(UIImage *)selectedImage {
_imagePhotoChosen.image = selectedImage;
CIImage *image = [CIImage imageWithCGImage:selectedImage.CGImage options:nil];
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:@{CIDetectorAccuracy : CIDetectorAccuracyHigh}];
CGAffineTransform transform = CGAffineTransformMakeScale(1, -1);
transform = CGAffineTransformTranslate(transform, 0, -selectedImage.size.height);
NSArray *features = [detector featuresInImage:image];
int i = 0;
for (CIFaceFeature *faceFeature in features)
{
const CGRect faceRect = CGRectApplyAffineTransform(faceFeature.bounds, transform);
const CGFloat scaleWidth = _imagePhotoChosen.frame.size.width/_imagePhotoChosen.image.size.width;
const CGFloat scaleHeight = _imagePhotoChosen.frame.size.height/_imagePhotoChosen.image.size.height;
CGRect faceFrame = CGRectMake(faceRect.origin.x * scaleWidth, faceRect.origin.y * scaleHeight, faceRect.size.width * scaleWidth, faceRect.size.height * scaleHeight);
UIView *faceView = [[UIView alloc] initWithFrame:faceFrame];
faceView.layer.borderColor = [[UIColor redColor] CGColor];
faceView.layer.borderWidth = 1.0f;
faceView.tag = i;
UITapGestureRecognizer *selectPhotoTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(selectPhoto)];
selectPhotoTap.numberOfTapsRequired = 1;
selectPhotoTap.numberOfTouchesRequired = 1;
[faceView addGestureRecognizer:selectPhotoTap];
[_imagePhotoChosen addSubview:faceView];
i++;
}
}
最佳答案
其实你做的是完全正确的,把这一行换成
CGRect faceFrame = CGRectMake(_imagePhotoChosen.frame.origin.x+ faceRect.origin.x * scaleWidth,_imagePhotoChosen.frame.origin.y+ faceRect.origin.y * scaleHeight, faceRect.size.width * scaleWidth, faceRect.size.height * scaleHeight);
关于ios - 由于缩放,使用 ImageView 进行人脸检测和缩放效果不佳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21507406/
我正在寻找一种用C# 编写的人脸、情感和语音识别方法。对于人脸识别,我早期使用的是 Emgu CV,它不准确,而且在弱光条件下性能非常低。我还需要找到用户的情绪。不管是悲伤还是快乐。但我发现使用 Em
我正在尝试使用 Apple 的 ARKit 3.0(Reality Kit)设置面部 anchor 但失败了。1. 以前只支持前置摄像头。现在还是这样吗?2.如何让Reality Kit的ARView
当我调试人脸 API 时抛出以下错误。 UnknownHostException@830035410936}“java.net.UnknownHostException:无法解析主机“api.proj
用例如下 我们的系统中有面孔列表 用户将上传一张图片 我们希望显示与上传图像匹配的面孔列表,例如置信度 >0.8 现在查看how to ,我的理解如下 使用人脸检测API,我们需要首先上传所有图像,包
用例如下 我们的系统中有面孔列表 用户将上传一张图片 我们希望显示与上传图像匹配的面孔列表,例如置信度 >0.8 现在查看how to ,我的理解如下 使用人脸检测API,我们需要首先上传所有图像,包
我正在寻找一种完美的方法来平滑二进制图像的边缘。问题是二值图像似乎是一个阶梯状的边界,这对我进一步的掩蔽过程来说非常不愉快。 我附加了一个原始二进制图像,该图像将被转换为平滑边缘,并且我还提供了预期的
我需要一个 java 库来确定哪个图像是“人体”;这是一张“人脸”;这是一个“动物”;这是一个“风景”等等。 有这样的东西吗? 谢谢 最佳答案 我不认为那里有什么方便的东西。特别是因为你在这里有非常广
自从过去 2 天以来,我一直在努力弄清楚出了什么问题?我正在使用 Microsoft 认知服务开发用于人脸识别的 Cordova android 应用程序。为了拍摄图像,我使用了 Cordova Ca
我是一名优秀的程序员,十分优秀!