轉換 UIImage 和 cv::Mat
在 OpenCV 中同常用 cv::Mat 表示圖片,而iOS中則是 UIImage 來表示圖片,因此我們就需要一些轉換的方法,OpenCV 的官方教程中給吃了轉換的方法,這裡摘錄如下:
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;
}