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;

}