ios opencv图片处理_[IOS OpenCV]摄像头采集图片用 CreateIplImageFromUIImage 转换后图像被旋转、变形解决方案...

CreateIplImageFromUIImage、UIImageFromIplImage

你上网搜索到的都是一样的,就认为是原版把。但是原版的CreateIplImageFromUIImage有个问题:

当你是处理非直接IOS摄像头采集到的图像时,没得问题(我测试的前提是这个图像是正方形的,Size:640*640)。

但是当你采集的图片是前置摄像头(我只需要用前置,所以只测试了前置的)一个正方形的时候,比如

Size: 640*640 那么基本没得什么大碍,只不过图片会被旋转90度。

问题就来了,我采集的是480*640的图片,最后得到的结果图片不止被旋转了90度,而且图像都变形了,比如人脸被压扁了···那要做人脸识别就蛋疼了···我可没得外星人的数据库···

于是搜索了下,在 http://stackoverflow.com/

看到了相关的提问,后面自己也解决了,顺便也回复了下。代码也是网上看到的,共享、记录下。

可以去这里去复制,看起来比这博客看的舒服点把。

http://stackoverflow.com/questions/4263365/iphone-converting-iplimage-to-uiimage-and-back-causes-rotation/10663685#10663685

对于 CreateIplImageFromUIImage

进行修改如下:

- (IplImage*)CreateIplImageFromUIImage:(UIImage*)image{CGImageRefimageRef=[selfrotateImage:image].CGImage;...........}

- (UIImage* )rotateImage:(UIImage

*)image {

int

kMaxResolution = 320;

// Or

whatever

CGImageRef

imgRef = image.CGImage;

CGFloat width

= CGImageGetWidth(imgRef);

CGFloat

height = CGImageGetHeight(imgRef);

CGAffineTransform transform =

CGAffineTransformIdentity;

CGRect bounds

= CGRectMake(0, 0, width,

height);

if (width

> kMaxResolution || height >

kMaxResolution) {

CGFloat ratio =

width / height;

if (ratio >

1 ) {

bounds.size.width = kMaxResolution;

bounds.size.height =

bounds.size.width / ratio;

}

else {

bounds.size.height = kMaxResolution;

bounds.size.width =

bounds.size.height * ratio;

}

}

CGFloat

scaleRatio = bounds.size.width /

width;

CGSize

imageSize =

CGSizeMake(CGImageGetWidth(imgRef),

CGImageGetHeight(imgRef));

CGFloat

boundHeight;

UIImageOrientation orient =

image.imageOrientation;

switch

(orient) {

case

UIImageOrientationUp:

//EXIF = 1

transform

= CGAffineTransformIdentity;

break;

case

UIImageOrientationUpMirrored:

//EXIF = 2

transform

=

CGAffineTransformMakeTranslation(imageSize.width,

0.0);

transform

= CGAffineTransformScale(transform, -1.0,

1.0 );

break;

case

UIImageOrientationDown:

//EXIF = 3

transform

=

CGAffineTransformMakeTranslation(imageSize.width,

imageSize.height);

transform

= CGAffineTransformRotate(transform,

M_PI);

break;

case

UIImageOrientationDownMirrored:

//EXIF = 4

transform

= CGAffineTransformMakeTranslation(0.0,

imageSize.height);

transform

= CGAffineTransformScale(transform, 1.0,

-1.0);

break;

case

UIImageOrientationLeftMirrored:

//EXIF = 5

boundHeight = bounds.size.height;

bounds.size.height =

bounds.size.width;

bounds.size.width = boundHeight;

transform

=

CGAffineTransformMakeTranslation(imageSize.height,

imageSize.width );

transform

= CGAffineTransformScale(transform, -1.0,

1.0);

transform

= CGAffineTransformRotate(transform, 3.0

* M_PI / 2.0 );

break;

case

UIImageOrientationLeft:

//EXIF = 6

boundHeight = bounds.size.height;

bounds.size.height =

bounds.size.width;

bounds.size.width = boundHeight;

transform

= CGAffineTransformMakeTranslation(0.0,

imageSize.width);

transform

= CGAffineTransformRotate( transform, 3.0

* M_PI / 2.0  );

break;

case

UIImageOrientationRightMirrored:

//EXIF = 7

boundHeight = bounds.size.height;

bounds.size.height =

bounds.size.width;

bounds.size.width = boundHeight;

transform

= CGAffineTransformMakeScale(-1.0,

1.0);

transform

= CGAffineTransformRotate( transform,

M_PI / 2.0);

break;

case

UIImageOrientationRight:

//EXIF = 8

boundHeight = bounds.size.height;

bounds.size.height =

bounds.size.width;

bounds.size.width = boundHeight;

transform

=

CGAffineTransformMakeTranslation(imageSize.height,

0.0);

transform

= CGAffineTransformRotate(transform, M_PI

/ 2.0 );

break;

default:

[NSException

raise:NSInternalInconsistencyException

format:@"Invalid image

orientation"];

}

UIGraphicsBeginImageContext(bounds.size);

CGContextRef

context =

UIGraphicsGetCurrentContext();

if (orient == UIImageOrientationRight

|| orient == UIImageOrientationLeft)

{

CGContextScaleCTM(context,

-scaleRatio, scaleRatio);

CGContextTranslateCTM(context,

-height, 0);

}

else {

CGContextScaleCTM(context,

scaleRatio, -scaleRatio);

CGContextTranslateCTM(context,

0, -height);

}

CGContextConcatCTM(context, transform );

CGContextDrawImage(UIGraphicsGetCurrentContext(),

CGRectMake(0,

0, width, height), imgRef);

UIImage *imageCopy =

UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return

imageCopy;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值