IOS 图片处理—-OpenCV

来源:互联网 发布:2016中小企业数据统计 编辑:程序博客网 时间:2024/06/05 20:35

IOS 图片处理—-OpenCV

在Opencv中所有的图片处理是基于Mat结构体处理的。然而在iOS中,在屏幕上显示的图片是类UIImage的实例。所以在iOS中使用Opencv,首先需要转换为Mat结构体。下面是Mat和UIImage相互转换。

//从UIImage对象转换为4通道的Mat,即是原图的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,         // Colorspace                                                    kCGImageAlphaNoneSkipLast |                                                    kCGBitmapByteOrderDefault); // Bitmap info flags    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);    CGContextRelease(contextRef);    return cvMat;}

在使用Mat做出图像处理后,需要将Mat转换会UIImage。以下是灰度图像与彩色图像转换处理(由信道中的值做出处理)。

cv::Mat greyMat;cv::cvtColor(inputMat, greyMat, CV_BGR2GRAY);

处理完图像后,Mat转成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((__bridge CFDataRef)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,                                   //CGDataProviderRef                                        NULL,                                       //decode                                        false,                                      //should interpolate                                        kCGRenderingIntentDefault                   //intent                                        );    // Getting UIImage from CGImage    UIImage *finalImage = [UIImage imageWithCGImage:imageRef];    CGImageRelease(imageRef);    CGDataProviderRelease(provider);    CGColorSpaceRelease(colorSpace);    return finalImage;}

原文地址:OpenCV iOS - Image Processing

0 0