Recortar una image en iOS usando la detección de rostros OpenCV

Utilicé el código siguiente para recortar una cara de una image, en el código de detección de mi cara. Pero no estoy obteniendo las imágenes correctas de la cara y obtengo parte de la image guardada y no la cara. ¿Qué sucede en mi código?

_faceCascade.detectMultiScale(mat, faces, 1.1, 2, kHaarOptions, cv::Size(40, 40)); 

Y en el interior de las funciones de la pantalla estoy recortando con este código:

 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); 

Obtengo las coorderadas correctas de faces[i] . Pero el problema es solo con recortar y configurar ROI. ¿Puede alguien ayudarme a resolverlo?

Intenté con el código siguiente también, nuevamente obtengo las mismas imágenes. (es decir, no estoy obteniendo la image de la cara real)

 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); 

Nota: estoy detectando la cara en la transmisión de video en vivo utilizando opencv facedetect. Puedo get el rectángulo verde alnetworkingedor de la cara. Pero no pude recortar la cara con parameters de cara. También intenté configurar faceroi para detectar ojos, incluso eso falla. Para networkingucir el problema, el problema podría estar en la configuration de ROI para la image.

Actualizado el 02/11/13:

He hecho Recortar como se muestra a continuación, pero el ROI no está configurado correctamente y la image no se recorta bien:

Encontré el problema de mi post anterior (gracias a @Jameo para señalar que es debido a un problema de rotation). He girado la image como se muestra a continuación.

 UIImage *rotateImage = [[UIImage alloc] initWithCGImage: image.CGImage scale: 1.0 orientation: UIImageOrientationRight]; 

Y recortó la image usando el siguiente Código:

 // 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; } 

La image se recorta pero no con coorderadas reales.

Mis observaciones: 1) Estoy recortando la image con FaceRect que devuelve Affinetransform. ¿Será esta una razón para las coorderadas equivocadas o es debido a un error en mi código? 2) No pude establecer ROI para una image antes de configurar Affine Transform, ¿cuál es la razón, este es el procedimiento para establecer ROI?

 faceRect = CGRectApplyAffineTransform(faceRect, t); 

Pero aun así, el cultivo no se realiza correctamente. La diferencia se muestra a continuación:

Imagen completa:

Imagen completa

Imagen recortada

introduzca la descripción de la imagen aquí

que hay de esto?

 - (UIImage *) getSubImageFrom:(UIImage *)imageToCrop WithRect:(CGRect)rect { CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect); UIImage *cropped = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); return cropped; } 

Intenta esto para get las coorderadas de la cara:

 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); 

y luego recorte la image usando:

 CGImageRef subImage = CGImageCreateWithImageInRect(image.CGImage, newBounds); UIImage *croppedImage = [UIImage imageWithCGImage:subImage]; UIImageView *newView = [[UIImageView alloc] initWithImage:croppedImage];