Pourquoi Faire pivoter l'image dans OpenCV sans code rotation?
-
26-10-2019 - |
Question
Je prends photo à l'aide AVCaptureStillImageOutput , AVCaptureSession , AVCaptureVideoPreviewLayer et l'afficher dans UIImageView . Son travail correctement.
Mais, après l'image d'affichage dans UIImage. Je détecte les visages en utilisant OpenCV de cette image affichée.
Il détecte, mais il renvoie l'image pivotée. Je n'utilise un code pour pivoter l'image. Sa rotation automatique de l'image.
Je veux arrêter de tourner.
Voici mon code.
+ (UIImage *) opencvFaceDetect:(UIImage *)originalImage {
cvSetErrMode(CV_ErrModeParent);
IplImage *image = [self CreateIplImageFromUIImage:originalImage];
// Scaling down
IplImage *small_image = cvCreateImage(cvSize(image->width/2,image->height/2), IPL_DEPTH_8U, 3);
cvPyrDown(image, small_image, CV_GAUSSIAN_5x5);
int scale = 2;
// Load XML
NSString *path = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_default" ofType:@"xml"];
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad([path cStringUsingEncoding:NSASCIIStringEncoding], NULL, NULL, NULL);
CvMemStorage* storage = cvCreateMemStorage(0);
// Detect faces and draw rectangle on them
CvSeq* faces = cvHaarDetectObjects(small_image, cascade, storage, 1.2f, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(20, 20), cvSize(100, 100));
cvReleaseImage(&small_image);
NSLog(@"found %d faces in image", faces->total);
// Create canvas to show the results
CGImageRef imageRef = originalImage.CGImage;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef contextRef = CGBitmapContextCreate(NULL, originalImage.size.width, originalImage.size.height, 8, originalImage.size.width * 4,
colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
CGContextDrawImage(contextRef, CGRectMake(0, 45, originalImage.size.width, originalImage.size.height), imageRef);
CGContextSetLineWidth(contextRef, 4);
CGContextSetRGBStrokeColor(contextRef, 0.0, 0.0, 1.0, 0.5);
// Draw results on the iamge
for(int i = 0; i < faces->total; i++) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Calc the rect of faces
CvRect cvrect = *(CvRect*)cvGetSeqElem(faces, i);
CGRect face_rect = CGContextConvertRectToDeviceSpace(contextRef,
CGRectMake(cvrect.x * scale, cvrect.y * scale, cvrect.width * scale, cvrect.height * scale));
CGContextStrokeRect(contextRef, face_rect);
[pool release];
}
UIImage *returnImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(contextRef)];
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
cvReleaseMemStorage(&storage);
cvReleaseHaarClassifierCascade(&cascade);
return returnImage;
}
Voici les captures d'écran
1) pour l'image avant d'appeler le visage méthode de détection
2) pour l'image après avoir appelé la méthode de détection de visage
La solution
Utilisez-vous UIImageJPEGRepresentation pour obtenir ces images sur? Si oui, alors vous pourriez être intéressé par ceci:
http://blog.logichigh.com/2008/06/05 / UIImage-fix /
-> « UIImageJPEGRepresentation (), le plus (? Seulement) façon de convertir un UIImage à un JPEG utilise le CGImage sous-jacente, et ne tient pas compte de votre UIImage imageOrientation, donc quelle que soit la position de la caméra lorsque l'image a été prise le JPEG exporté toujours être orienté en mode paysage ou droit, de se retrouver avec des images que la rotation de besoin ».
Ceci laisse présager que même si vous ne l'utilisez cette fonction, il y a une imageOrientation
implicite à considérer lors de l'utilisation UIImage
.