OpenCV+iOS开发使用文档

 
一、      前言
    OpenCV是开源的跨平台的计算机视觉库,实现了图像处理、计算机视觉和机器学习的很多通用算法。
对于移动设备没有快速输入的键盘,大的屏幕,其优势在于图像和声音,因此要发挥好移动设备的性能,必须很好的利用这一特点。
本文档主要说明如何在iOS系统中使用OpenCV
二、      开发准备
1.        下载OpenCV for iOS
2.        打开XCode,新建一个工程,例如新建一个Single View Application
3.        在项目中添加下载好的OpenCV库,其中一种添加方式,在新建好的项目中,右键Framework,选择Add Files to,在跳出的窗口中找到opencv 2.framework 点击add
 
4.        最终效果图如下:
5.        因为OpenCV中的MIN宏和UIKitMIN宏有冲突。所以需要在.pch文件中,先定义OpenCV的头文件,否则会有编译错误。将工程的.pch文件内容修改成如下所示:
  
         #ifdef __cplusplus
         #import <opencv2/opencv.hpp>
#endif
6.        在使用OpenCV时,主要使用OpenCVC++接口,为了混合使用C++Objective-C,需将源文件扩展名为.m的改成.mm
7.        iOS中图像的显示主要通过UIImage,在OpenCV中处理通过Mat类型,两者之间要进行转换,显示通过UIImage,处理通过Mat。转换写成一个公共类文件UIImageCVMatConverter.mm,添加到项目中,具体见附件。
8.        在使用到OpenCV的地方跟原C++一样。
三、      测试项目
对基本的图像处理算法进行测试给出原图,测试效果图,处理时间,代码。
1.        建议对图像处理部分单独建一个类,将设计与处理分开。
2.        打开.h头文件,直接引用C++OpenCV库,添加要实现的方法,具体如下:
3.        .mm文件中具体实现,实现的部分代码如下:
4.        Objective-C调用,在头文件中添加类似下面的方法,传入参数为待处理图像、处理方法的序号
-(UIImage *)processImage:(UIImage *)inputImage number:(int)useNumber;
具体实现如下:
-(UIImage *)processImage:(UIImage *)inputImage number:(int)useNumber
{
    cv::Mat inputMat = [UIImageCVMatConverter cvMatFromUIImage:inputImage];
    cv::Mat resultMat;
    //这边到时构建一个字典,将序号转成调用名
    switch (useNumber)
    {
        case 0:
            resultMat =[self cannyConversion:inputMat];
            break;
        case 1:
            resultMat =[self equalizeHistConversion:inputMat];
            break;
        case 2:
            resultMat =[self harrisConversion:inputMat];
            break;
        case 3:
            resultMat =[self siftConversion:inputMat];
            break;
        case 4:
            resultMat =[self surfConversion:inputMat];
            break;
           
        default:
            break;
    }
    inputMat.release();
    return [UIImageCVMatConverter UIImageFromCVMat:resultMat];
}
5.        设计界面,调用上述处理函数
                     i.            添加toolbarimageview设计界面如下:
        ii.      设置关联,如下图:
      iii.      调用的过程
1.   获得加载图片的UIImage,本例如下:
NSString *fileName = [[NSBundle mainBundle] pathForResource:@"fruits" ofType:@"jpg"];
           imageView.image = [UIImage         imageWithContentsOfFile:fileName];
                    imageView.contentMode = UIViewContentModeScaleAspectFit;
                     loadImage = imageView.image;
将加载的图片的UIImage给上述中的loadImageloadImage进行转换到Mat
2.   处理
直接调用之前写好的ImageProcessing
imageView.image = [imageProcessing processImage:loadImage  number:numberOfprocess ];
四、   实验结果
算法名
Canny
Harris
SIFT
SURF
测试时间ms
9
40
176
143
实验效果
五、   参考
原文地址:https://www.cnblogs.com/fengbing/p/3269414.html