轉(zhuǎn)換 UIImage 和 cv::Mat
在 OpenCV 中同常用 cv::Mat 表示圖片,而iOS中則是 UIImage 來表示圖片桑腮,因此我們就需要一些轉(zhuǎn)換的方法,OpenCV 的官方教程中給吃了轉(zhuǎn)換的方法蛉幸,這里摘錄如下:
UIImage To cv::Mat:
- (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,// Colorspacek
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CGImageAlphaNoneSkipLast | kCGBitmapByteOrderDefault);// Bitmap info flags
? ? ? ? ? ? ? ? ? ?CGContextDrawImage(contextRef, CGRectMake(0,0, cols, rows), image.CGImage);??
? ? ? ? ? ? ? ? ? ? CGContextRelease(contextRef);
? ? ? ? ? ? ? ? ? returncvMat;
}
-(cv::Mat)cvMatGrayFromUIImage(UIImage*)image{ ? ? ?
CGColorSpaceRef colorSpace=CGImageGetColorSpace(image.CGImage);
CGFloatcols=image.size.width;
CGFloatrows=image.size.height;
cv::MatcvMat(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 infoflags
?CGContextDrawImage(contextRef,CGRectMake(0,0,cols,rows),image.CGImage);
CGContextRelease(contextRef);
returncvMat;
}
cv::Mat To UIImage:
-(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((__bridgeCFDataRef)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,//CGDataProvider
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? RefNULL,//decode
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?false,//should interpolate
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCGRenderingIntentDefault//intent
);
// Getting UIImage from CGImage
UIImage*finalImage=[UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
returnfinalImage;
}