5

在我的人脸检测代码中,我使用以下代码从图像中裁剪人脸。但我没有得到正确的人脸图像,我得到的是图像的一部分,而不是人脸。我的代码有什么问题?

_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) 在设置仿射变换之前我无法为图像设置 ROI,这是什么原因,这是设置 ROI 的过程吗?

faceRect = CGRectApplyAffineTransform(faceRect, t);

但是仍然没有正确进行裁剪 区别如下所示:

全图:

全图

裁剪图像

在此处输入图像描述

4

2 回答 2

1

那这个呢?

- (UIImage *) getSubImageFrom:(UIImage *)imageToCrop WithRect:(CGRect)rect {

    CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);    
    UIImage *cropped = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);

    return cropped;    
}
于 2013-05-08T17:19:55.373 回答
0

试试这个来获得面部坐标:

CGRect newBounds = CGRectMake(faceFeature.bounds.origin.x, 
                              _picture.size.height - faceFeature.bounds.origin.y - largestFace.bounds.size.height, 
                              faceFeature.bounds.size.width, 
                              faceFeature.bounds.size.height);

然后使用以下方法裁剪图像:

CGImageRef subImage = CGImageCreateWithImageInRect(image.CGImage, newBounds);
UIImage *croppedImage = [UIImage imageWithCGImage:subImage];
UIImageView *newView = [[UIImageView alloc] initWithImage:croppedImage];
于 2015-10-10T06:12:27.367 回答