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 に答える