Last active
June 29, 2017 08:39
-
-
Save WhiteTeeth/44635061d9f0fd772e335b511e3ad834 to your computer and use it in GitHub Desktop.
UIImage 转为 CVImageBufferRef、cv::Mat 的方法,CVImageBufferRef 和 cv::Mat 的转换方法见 https://gist.github.com/WhiteTeeth/479850ecbf748c109d20c279f147e5ed
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <UIKit/UIKit.h> | |
#import <opencv2/opencv.hpp> | |
@interface UIImage (Convert) | |
// CVImageBufferBuf 转为 UIImage | |
+ (UIImage*)imageWithImageBuffer:(CVImageBufferRef)imageBuffer; | |
// UIImage 转为 cv::Mat | |
- (cv::Mat)cvMat; | |
// cv::Mat 转为 UIImage | |
+ (UIImage *)imageWithCVMat:(cv::Mat)cvMat; | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import "UIImage+Convert.h" | |
@implementation UIImage (Convert) | |
// CVImageBufferBuf 转为 UIImage | |
+ (UIImage*)imageWithImageBuffer:(CVImageBufferRef)imageBuffer | |
{ | |
CVPixelBufferLockBaseAddress(imageBuffer,0); | |
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer); | |
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); | |
size_t width = CVPixelBufferGetWidth(imageBuffer); | |
size_t height = CVPixelBufferGetHeight(imageBuffer); | |
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); | |
CGContextRef newContext = CGBitmapContextCreate(baseAddress, | |
width, height, 8, bytesPerRow, colorSpace, | |
kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); | |
CGImageRef newImage = CGBitmapContextCreateImage(newContext); | |
CGContextRelease(newContext); | |
CGColorSpaceRelease(colorSpace); | |
UIImage *image= [UIImage imageWithCGImage:newImage scale:1.0 orientation:UIImageOrientationRight]; | |
CGImageRelease(newImage); | |
return image; | |
} | |
// UIImage 转为 cv::Mat | |
- (cv::Mat)cvMat | |
{ | |
UIImage *image = self; | |
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); | |
CGFloat cols = image.size.width; | |
CGFloat rows = image.size.height; | |
cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha) | |
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to data | |
cols, // Width of bitmap | |
rows, // Height of bitmap | |
8, // Bits per component | |
cvMat.step[0], // Bytes per row | |
colorSpace, // Colorspace | |
kCGImageAlphaNoneSkipLast | | |
kCGBitmapByteOrderDefault); // Bitmap info flags | |
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage); | |
CGContextRelease(contextRef); | |
return cvMat; | |
} | |
// cv::Mat 转为 UIImage | |
+ (UIImage *)imageWithCVMat:(cv::Mat)cvMat | |
{ | |
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()]; | |
CGColorSpaceRef colorSpace; | |
if (cvMat.elemSize() == 1) { | |
colorSpace = CGColorSpaceCreateDeviceGray(); | |
} else { | |
colorSpace = CGColorSpaceCreateDeviceRGB(); | |
} | |
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); | |
// Creating CGImage from cv::Mat | |
CGImageRef imageRef = CGImageCreate(cvMat.cols, //width | |
cvMat.rows, //height | |
8, //bits per component | |
8 * cvMat.elemSize(), //bits per pixel | |
cvMat.step[0], //bytesPerRow | |
colorSpace, //colorspace | |
kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info | |
provider, //CGDataProviderRef | |
NULL, //decode | |
false, //should interpolate | |
kCGRenderingIntentDefault //intent | |
); | |
// Getting UIImage from CGImage | |
UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; | |
CGImageRelease(imageRef); | |
CGDataProviderRelease(provider); | |
CGColorSpaceRelease(colorSpace); | |
return finalImage; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment