为什么在没有旋转代码的情况下旋转OpenCV中的图像?
-
26-10-2019 - |
题
我正在使用照片 AvCaptureStillimageOutput, Avcapturesession, AvCaptureVideOpreviewlayer 并显示在 UIImageView. 。它的工作正常。
但是,在uiimage中显示图像之后。我正在使用该显示图像的OpenCV检测到面孔。
它检测到,但返回旋转的图像。我不使用任何代码旋转图像。它自动旋转图像。
我想停止旋转。
这是我的代码。
+ (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;
}
这是屏幕截图
1)在呼叫面部检测方法之前的图像
2)呼叫面部检测方法后的图像
解决方案
您是否使用uiimagejpegresentation将这些图像删除?如果是这样,那么您可能对此感兴趣:
http://blog.logichigh.com/2008/06/05/uiimage-fix/
- >“ uiimagejpegrepresentation(),最简单的(唯一?)将UIIMAGE转换为JPEG的方法使用基础的cgimage,而忽略您的uiimage映像方向,因此,无论何时将图片置于导出的jpeg时,无论摄像机的位置如何在景观或正确的模式下,最终需要旋转的图片。”
这暗示即使您不使用此功能,也有一个隐式 imageOrientation
考虑使用时考虑 UIImage
.
不隶属于 StackOverflow