顔検出コードで、以下のコードを使用して画像から顔をトリミングしました。しかし、私は適切な顔の画像を取得しておらず、顔ではなく画像の一部を保存しています。私のコードで何が問題になっていますか?
_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);
しかし、まだトリミングは適切に行われていません。違いを以下に示します。
完全な画像:
トリミングされた画像