一、 前言
OpenCV是开源的跨平台的计算机视觉库,实现了图像处理、计算机视觉和机器学习的很多通用算法。
对于移动设备没有快速输入的键盘,大的屏幕,其优势在于图像和声音,因此要发挥好移动设备的性能,必须很好的利用这一特点。
本文档主要说明如何在iOS系统中使用OpenCV。
二、 开发准备
2. 打开XCode,新建一个工程,例如新建一个Single View Application
3. 在项目中添加下载好的OpenCV库,其中一种添加方式,在新建好的项目中,右键Framework,选择Add Files to,在跳出的窗口中找到opencv 2.framework后 点击add。
4. 最终效果图如下:
5. 因为OpenCV中的MIN宏和UIKit的MIN宏有冲突。所以需要在.pch文件中,先定义OpenCV的头文件,否则会有编译错误。将工程的.pch文件内容修改成如下所示:
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
6. 在使用OpenCV时,主要使用OpenCV的C++接口,为了混合使用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. 添加toolbar和imageview设计界面如下:
ii. 设置关联,如下图:
iii. 调用的过程
1. 获得加载图片的UIImage,本例如下:
NSString *fileName = [[NSBundle mainBundle] pathForResource:@"fruits" ofType:@"jpg"];
imageView.image = [UIImage imageWithContentsOfFile:fileName];
imageView.contentMode = UIViewContentModeScaleAspectFit;
loadImage = imageView.image;
将加载的图片的UIImage给上述中的loadImage,loadImage进行转换到Mat
2. 处理
直接调用之前写好的ImageProcessing类
imageView.image = [imageProcessing processImage:loadImage number:numberOfprocess ];
四、 实验结果
算法名
|
Canny
|
Harris
|
SIFT
|
SURF
|
测试时间ms
|
9
|
40
|
176
|
143
|
实验效果
|
|
|
|
|
五、 参考