OpenCV学习_ios平台(一):在ios平台调用

demo地址:https://github.com/GoldenRocking/OpenCV_iOS
OpenCV是一个开源的计算机视觉库。OpenCV采用C/C++语言编写。关于OpenCV的简单介绍,会在下一节讲到。这一节主要介绍如何在iOS平台调用OpenCV函数。

首先,我们需要到OpenCV官网下载其framework:http://opencv.org/downloads.html;

下载好opencv2.framework后,我们便可以将其引入xcode工程。
在用OpenCV处理图像以前,我们首先要做的的是先将UIImage格式的图片转换为cvMat的数据类型:

+(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;
}

openCV可以通过其相关的函数来处理cvMat 数据。处理结束之后,我们需要将cvMat 数据转化为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;
}

我们可以创建一个PrefixHeader.pch文件,在工程的Build Settings->Prefix Header中将其引入:


#ifndef PrefixHeader_pch
#define PrefixHeader_pch

// Include any system framework and library headers here that should be included in all compilation units.
// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.

#ifdef __cplusplus
#import 
#endif

#endif /* PrefixHeader_pch */

这样就不需要每次在ViewController中导入头文件了。

由于OpenCV是用C++所写,所以我们在引用的地方需要将.m文件修改为.mm。为了方便使用库函数,我们可以在调用的类中添加如下代码:

using namespace cv;

下面是一个简单的图像灰度处理方法的调用:

     UIImage *image = [UIImage imageNamed:@"timg"];
     Mat mat = [cvprocess cvMatFromUIImage:image];
     Mat grayMat;
     cvtColor(mat, grayMat, CV_BGR2GRAY);
     
     UIImage *cvimage = [cvprocess UIImageFromCVMat:grayMat];
     UIImageView *imview = [[UIImageView alloc]initWithImage:cvimage];
     imview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
     [self.view addSubview:imview];

处理之前的图像为:

OpenCV学习_ios平台(一):在ios平台调用_第1张图片
timg.png

处理之后的图像为:

OpenCV学习_ios平台(一):在ios平台调用_第2张图片
gray.png

demo地址:https://github.com/GoldenRocking/OpenCV_iOS

你可能感兴趣的:(OpenCV学习_ios平台(一):在ios平台调用)