UIImage和IplImage之间的相互转换

来源:互联网 发布:centos smb unrec 编辑:程序博客网 时间:2024/05/21 11:05

Converting images between UIImage and IplImage

This content is copied from Yoshimasa's blog.

Converting images between UIImage and IplImage

OpenCV is using IplImage structure for processing, and iPhone SDK using UIImage object to display it on the screen. This means, we need a converter between UIImage and IplImage. Thankfully, we can do with iPhone SDK APIs.

Creating IplImage from UIImage is like this.

// NOTE you SHOULD cvReleaseImage() for the return value when end of the code.- (IplImage *)CreateIplImageFromUIImage:(UIImage *)image {  // Getting CGImage from UIImage  CGImageRef imageRef = image.CGImage;  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  // Creating temporal IplImage for drawing  IplImage *iplimage = cvCreateImage(    cvSize(image.size.width,image.size.height), IPL_DEPTH_8U, 4  );  // Creating CGContext for temporal IplImage  CGContextRef contextRef = CGBitmapContextCreate(    iplimage->imageData, iplimage->width, iplimage->height,    iplimage->depth, iplimage->widthStep,    colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault  );  // Drawing CGImage to CGContext  CGContextDrawImage(    contextRef,    CGRectMake(0, 0, image.size.width, image.size.height),    imageRef  );  CGContextRelease(contextRef);  CGColorSpaceRelease(colorSpace);  // Creating result IplImage  IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);  cvCvtColor(iplimage, ret, CV_RGBA2BGR);  cvReleaseImage(&iplimage);  return ret;}

Don’t forget release IplImage after using it by cvReleaseImage!

And creating UIImage from IplImage is like this.

// NOTE You should convert color mode as RGB before passing to this function- (UIImage *)UIImageFromIplImage:(IplImage *)image {  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  // Allocating the buffer for CGImage  NSData *data =    [NSData dataWithBytes:image->imageData length:image->imageSize];  CGDataProviderRef provider =    CGDataProviderCreateWithCFData((CFDataRef)data);  // Creating CGImage from chunk of IplImage  CGImageRef imageRef = CGImageCreate(    image->width, image->height,    image->depth, image->depth * image->nChannels, image->widthStep,    colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,    provider, NULL, false, kCGRenderingIntentDefault  );  // Getting UIImage from CGImage  UIImage *ret = [UIImage imageWithCGImage:imageRef];  CGImageRelease(imageRef);  CGDataProviderRelease(provider);  CGColorSpaceRelease(colorSpace);  return ret;}