iOS中使用opencv進行影象識別操作

一個蘿蔔壹個坑發表於2018-01-03

轉換 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;

}

相關文章