【发布时间】:2013-01-23 06:29:43
【问题描述】:
在我的人脸检测代码中,我使用以下代码从图像中裁剪人脸。但我没有得到正确的人脸图像,我得到的是图像的一部分,而不是人脸。我的代码有什么问题?
_faceCascade.detectMultiScale(mat, faces, 1.1, 2, kHaarOptions, cv::Size(40, 40));
在 displayfaces 函数内部,我正在使用以下代码进行裁剪:
CGRect cropRect = CGRectMake(faces[i].x, faces[i].y, faces[i].width, faces[i].width);
CGImageRef cropped_img = CGImageCreateWithImageInRect(self.storeImage.CGImage, cropRect);
UIImage *img = [UIImage imageWithCGImage:cropped_img];
UIImageWriteToSavedPhotosAlbum( img, self, nil,nil);
我得到了faces[i] 的正确坐标。但问题仅在于裁剪和设置 ROI。有人可以帮我解决它吗?
我也尝试使用以下代码,再次获得相同的图像。 (即,没有得到实际的人脸图像)
cv :: Mat image_roi;
cv::Rect roi(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
cv::Mat(testMat, roi).copyTo(image_roi);
UIImage *img = [CaptureViewController imageWithCVMat:image_roi ];
UIImageWriteToSavedPhotosAlbum( img, self, nil,nil);
注意:我正在使用 opencv facedetect 检测实时视频流中的人脸。我可以得到脸部周围的绿色矩形。但我无法使用面部参数裁剪面部。我还尝试设置 faceroi 来检测眼睛,即使这样也失败了。为了缩小问题范围,问题可能在于为图像设置 ROI?
2013 年 11 月 2 日更新:
我已经完成了如下裁剪,但 ROI 设置不正确,图像裁剪不好:
我在上面的帖子中发现了问题(感谢@Jameo 指出这是因为旋转问题。)我已将图像旋转如下。
UIImage *rotateImage = [[UIImage alloc] initWithCGImage: image.CGImage
scale: 1.0
orientation: UIImageOrientationRight];
并使用以下代码裁剪图像:
// get sub image
+ (UIImage*) getSubImageFrom: (UIImage*) img WithRect: (CGRect) rect
{
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
// translated rectangle for drawing sub image
CGRect drawRect = CGRectMake(-rect.origin.x, -rect.origin.y, img.size.width, img.size.height);
// clip to the bounds of the image context
// not strictly necessary as it will get clipped anyway?
CGContextClipToRect(context, CGRectMake(0, 0, rect.size.width, rect.size.height));
// draw image
[img drawInRect:drawRect];
// grab image
UIImage* subImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return subImage;
}
图像被裁剪,但没有实际坐标。
我的观察: 1) 使用 Affinetransform 返回的 FaceRect 裁剪图像。这会是错误坐标的原因还是因为我的代码中的错误? 2) 在设置Affine Transform之前无法设置图像的ROI,是什么原因,这是设置ROI的过程吗?
faceRect = CGRectApplyAffineTransform(faceRect, t);
但仍然没有正确进行裁剪 区别如下所示:
全图:
裁剪图像
【问题讨论】:
-
只是好奇,这个保存的是什么图片?它只是图像的不同子集吗?如果是这样,也许这就是您的投资回报率。我肯定会 NSLog 你的投资回报率,看看它在做什么
-
@Jameo ya 它保存了我的图像子集而不是脸部。但是我可以检测到具有相同面孔[i] 的面孔吗?即使失败,我也尝试设置面部的投资回报率。请您看一下我帖子的注释部分。
-
记录 roi 坐标,看看它们是否有意义,例如 NSLog(@"Coorindates: %d, %d, %d, %d, ", faces[i].x , 面[i].y, 面[i].width, 面[i].height);并发布结果。这将缩小正在发生的事情。它要么是您给它的 坐标 的问题,要么是您裁剪它的 方式 的问题,但我的猜测是坐标
-
x = 45,y = 105,width = 124,height = 124。这些是 faces[i].x, face[i].y,faces[i].width 的值,faces[i].height 分别。但我的主要疑问是坐标是否错误,如何在脸部周围画一个矩形?
-
我不知道你最后一句话是什么意思。我在旋转图像时遇到了很多麻烦,这可能是个问题吗?(为了测试你也可以输出输入帧的 x、y、宽度和高度)然后问问自己,这些坐标是否有意义这个屏幕?我怀疑这是因为您的裁剪看起来正确
标签: iphone ios objective-c image-processing opencv