Created
May 22, 2015 06:47
-
-
Save codeOfRobin/68a62cc033a34d640964 to your computer and use it in GitHub Desktop.
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
- (cv::Mat)cvMatFromUIImage:(UIImage *)image | |
{ | |
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)cvMatGrayFromUIImage:(UIImage *)image | |
{ | |
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); | |
CGFloat cols = image.size.width; | |
CGFloat rows = image.size.height; | |
cv::Mat cvMat(rows, cols, CV_8UC1); // 8 bits per component, 1 channels | |
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; | |
} | |
-(UIImage *)UIImageFromCVMat:(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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment