一、      前言
    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宏和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
实验效果
五、   参考

OpenCV+iOS开发使用文档的更多相关文章

  1. iOS开发-相关文档

    关于调试,查看Xcode Overview文档相关部分:http://developer.apple.com/library/ios/documentation/ToolsLanguages/Conc ...

  2. IOS开发在线文档 记录下

    View Programming Guide for iOS https://developer.apple.com/library/prerelease/ios/documentation/UIKi ...

  3. iOS开发官方文档汇总

    程序员的学习过程是无止境的,程序员学习的途径是多样的.可以从视频教程中领悟,也可以从他人的代码中 理解.但当我们专注于某一个平台在开发的时候,对于某个API使用或者功能实现有疑问,通常简单的测试可以让 ...

  4. Enterprise Solution 2.2 开发帮助文档集合

    首先是一个PPT文档,从宏观层面展示Enterprise Soltion的几个功能特色. Enterprise Solution解决方案安装与配置 将源代码解决方案和演示程序在电脑中进行配置,作为了解 ...

  5. WEB前端开发规范文档(转)

    http://codeguide.bootcss.com/  编写灵活.稳定.高质量的 HTML 和 CSS 代码的规范上面的文档 再结合下面的规范: 无论是从技术角度还是开发视角,对于web前端开发 ...

  6. Android APP开发需求文档范本

    Android  APP开发需求文档范本 软件需求文档格式的标准写法 1.引言 1.1 编写目的 • 阐明开发本软件的目的: 1.2 项目背景 • 标识待开发软件产品的名称.代码: • 列出本项目的任 ...

  7. 网站开发进阶(三十八)Web前端开发规范文档你需要知道的事

    Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...

  8. FlappyBird开发帮助文档

    FlappyBird开发帮助文档 项目需求 完成FlappyBird游戏. 功能说明: 游戏开始后,间歇性的点击鼠标,让小鸟向上飞,不会掉下来,并且要穿过柱子的空隙,不能碰到柱子,碰到就dead了,穿 ...

  9. Web前端开发规范文档你需要知道的事

    Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...

随机推荐

  1. akka设计模式系列-慎用ask

    慎用ask应该是Akka设计的一个准则,很多时候我们应该禁用ask.之所以单独把ask拎出来作为一篇博文,主要是akka的初学者往往对ask的使用比较疑惑. "Using ask will ...

  2. 【洛谷2904/BZOJ1617】[USACO08MAR]跨河River Crossing(动态规划)

    题目:洛谷2904 分析: 裸dp-- dp方程也不难想: \(dp[i]\)表示运\(i\)头牛需要的最短时间,\(sum[i]\)表示一次运\(i\)头牛(往返)所需的时间,则 \[dp[i]=m ...

  3. ACM_Power Mouth

    Power Mouth Time Limit: 2000/1000ms (Java/Others) Problem Description: Your task is to calculate the ...

  4. python导入包出错:ImportError: No module named XXXXX

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用. 如果想 ...

  5. scala控制流程语句

    直接上代码了哈. package com.test.scala.test object Kongzi { def main(args: Array[String]): Unit = { //if 语句 ...

  6. 通过yum命令搭建lamp环境(centos6.5)

    centos 6.5 1.yum安装和源代码编译在使用的时候没啥区别,但是安装的过程就大相径庭了,yum只需要3个命令就可以完成,源代码需要13个包,还得加压编译,步骤很麻烦,而且当做有时候会出错,源 ...

  7. Eclipse中搭建Apache Tomcat7源码调试环境

    第一步:获取Apache Tomcat7源码,读者可以从Apache 官方网站获取,官方下载地址: http://tomcat.apache.org/download-70.cgi 注意选择Sourc ...

  8. 1B课程笔记分享_StudyJams_2017

    课程1B 概述 课程1B主要讲解了Android UI的ViewGroups(视图组).LinearLayout(线性布局).RelativeLayout(相对布局),Portrait Mode(竖屏 ...

  9. 5.C#编写Redis访问类

    那么通过前面几篇博文,服务端的安装和配置应该没什么问题了,接下来的问题是如何通过代码来访问Redis. 这里我们使用的库为: StackExchange.Redis GitHub:https://gi ...

  10. js 不能用关键字 delete 做函数名

    把delete更改为mydelete正常.