本系列文章采用的的开发环境为:c++
1)Xcode 6算法
2)OpenCV for iOS 3.0.0 安全
-------------------分割线----------------------------app
1.coder都知道开发以前须要作的就是平台搭建(混蛋不想配置环境~)测试
在OpenCV官网下载OpenCV开发包(推荐最新版,支持64位哦)ui
Step 1:建立一个新的项目atom
Step 2:在Building phase里面添加opencv2.frameworkspa
简单的惨绝人寰的环境配置。code
2.终于要开始写代码了blog
因为OpenCV代码时基于C++编写的,所以,要在项目中运行c++代码,须要将文件名后缀由.m改为.mm,如上图所示。
(这么干或许能行得通,却不是什么好主意。正确的方式是给全部你要在 app 中使用到的 OpenCV 功能写一层 Objective-C++ 封装。这些 Objective-C++ 封装把 OpenCV 的 C++ API 转化为安全的 Objective-C API,以方便地在全部 Objective-C 类中使用。走封装的路子,你的工程中就能够只在这些封装中调用 C++ 代码,从而避免掉不少让人头痛的问题,好比直接改文件后缀名会由于在错误的文件中引用了一个 C++ 头文件而产生难以追踪的编译错误。之后有机会咱们来这么写吧,今天不想~~)
OpenCV 声明了命名空间 cv
,所以 OpenCV 的类的前面会有个 cv::
前缀,就像 cv::Mat
、 cv::Algorithm
等等。你也能够在 .mm
文件中使用 using namespace cv
来避免在一堆类名前使用 cv::
前缀。
可是,在某些类名前你必须使用命名空间前缀,好比 cv::Rect
和 cv::Point
,由于它们会跟定义在 MacTypes.h
中的 Rect
和 Point
相冲突。尽管这只是我的偏好问题,我仍是偏向在任何地方都使用 cv::
以保持一致性。
说了那么多先测试一下吧。
@interface ViewController () { cv::Mat cvImage; } @property (weak, nonatomic) IBOutlet UIImageView *imgView; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; CGRect rect = [UIScreen mainScreen].bounds; self.imgView.frame = rect; UIImage *image = [UIImage imageNamed:@"lenna.png"]; UIImageToMat(image, cvImage); if(!cvImage.empty()){ cv::Mat gray; // 将图像转换为灰度显示 cv::cvtColor(cvImage,gray,CV_RGB2GRAY); // 应用高斯滤波器去除小的边缘 cv::GaussianBlur(gray, gray, cv::Size(5,5), 1.2,1.2); // 计算与画布边缘 cv::Mat edges; cv::Canny(gray, edges, 0, 50); // 使用白色填充 cvImage.setTo(cv::Scalar::all(225)); // 修改边缘颜色 cvImage.setTo(cv::Scalar(0,128,255,255),edges); // 将Mat转换为Xcode的UIImageView显示 self.imgView.image = MatToUIImage(cvImage); } }
因为只是一个简单的测试程序。咱们的storyboard也很是的简单的用UIImageView填充满屏幕。
看一下结果吧。
从上面能够看出,咱们能够很是很是简单地在iOS下使用OpenCV。接下来就是理解并使用OpenCV的各个功能算法。
那么咱们为什么不趁热看一下接下的文章呢。