这里要讲一个大坑。
最近在做ios端的深度学习,从视频中获取图像数据,传入深度学习模型中进行预测,但总是无结果。
将图像显示到uiimageview上看是正常的,但是在输入到模型时,旋转了90度,距离砸键盘只差一个小时的距离。
终于,在看了这篇博客之后, 茅塞顿开。原来在我输入模型之前,对image进行了像素操作,去掉了图像alpha通道,所以原本图像EXIF中的imageOrientation没有了,从3变成了0,所以就旋转了90度。
所以,从相机获取出来的图像,需要在操作之前,需要使用以下方法:
- (UIImage*)fixOrientation:(UIImage*)image
{
if (image.imageOrientation == UIImageOrientationUp)
return image;
CGAffineTransform transform = CGAffineTransformIdentity;
switch (image.imageOrientation) {
case UIImageOrientationDown:
case UIImageOrientationDownMirrored:
transform =CGAffineTransformTranslate(transform, image.size.width, image.size.height);
transform =CGAffineTransformRotate(transform,M_PI);
break;
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
transform =CGAffineTransformTranslate(transform, image.size.width,0);
transform =CGAffineTransformRotate(transform,M_PI_2);
break;
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
transform =CGAffineTransformTranslate(transform,0, image.size.height);
transform =CGAffineTransformRotate(transform, -M_PI_2);
break;
default:
break;
}
switch (image.imageOrientation) {
case UIImageOrientationUpMirrored:
case UIImageOrientationDownMirrored:
transform =CGAffineTransformTranslate(transform, image.size.width,0);
transform =CGAffineTransformScale(transform, -1,1);
break;
case UIImageOrientationLeftMirrored:
case UIImageOrientationRightMirrored:
transform =CGAffineTransformTranslate(transform, image.size.height,0);
transform =CGAffineTransformScale(transform, -1,1);
break;
default:
break;
}
CGContextRef ctx = CGBitmapContextCreate(NULL, image.size.width, image.size.height,
CGImageGetBitsPerComponent(image.CGImage),0,
CGImageGetColorSpace(image.CGImage),
CGImageGetBitmapInfo(image.CGImage));
CGContextConcatCTM(ctx, transform);
switch (image.imageOrientation) {
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
CGContextDrawImage(ctx,CGRectMake(0,0,image.size.height,image.size.width), image.CGImage);
break;
default:
CGContextDrawImage(ctx,CGRectMake(0,0,image.size.width,image.size.height), image.CGImage);
break;
}
CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
UIImage*img = [UIImage imageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
return img;
}
其实我发现,好像除了初始为UIImageOrientationUp的image,在操作钱 都需要调用该函数,防止旋转90度。
最后讲一点感想,这两天都在搞这个问题,本来是已经用opencv搞定了,但是为了纯粹,还是想把这个问题搞明白,所以今天搞了一天。但是大部分时间做了一下无用功,应该及时查阅资料,这样可以快点解决问题。以此为鉴。