Je prends photo à l'aide AVCaptureStillImageOutput, AVCaptureSession, AVCaptureVideoPreviewLayer et l'afficher dans UIImageView. Son travail correctement.Pourquoi faire pivoter Image dans OpenCV sans code de rotation?
Mais, Après l'affichage de l'image dans UIImage. Je détecte des visages en utilisant OpenCV à partir de cette image affichée.
Il détecte, mais il renvoie l'image pivotée. Je n'utilise aucun code pour faire pivoter l'image. Il fait automatiquement pivoter 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) l'image pour avant d'appeler la méthode de détection de visage
2) l'image pour après avoir appelé la méthode de détection de visage
Bonjour benosteen, Merci pour votre réponse. En utilisant ceci, puis-je arrêter de tourner? –
Je crois que si vous changez le 'imageOrientation' pour correspondre à ce que vous attendez -' 'UP'' ou' 'DROIT '' je pense. Je n'ai pas un iphone sdk/etc pour tester, mais le code sur ce lien devrait vous aider à le tester. – benosteen
J'ai testé ci-dessus le code lien. Mais toujours pas d'effet. –