Convert UIImage and CV ::Mat
In OpenCV, CV ::Mat represents the image, while in iOS, UIImage represents the image, so we need some conversion methods, OpenCV official tutorial to take the conversion method, here is an extract:
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;
}