iOS开发大神总结

iOS与Opencv的探秘之Opencv认识,适配Xcode

2017-03-22  本文已影响633人  iOS_ZK03

本章及以后文章所采用的开发环境:
(1)xcode 8.2
(2)opencv for iOS 3.2
ps:低于xcode8.0版本,opencv环境会出现报错[会发生<opencv2/opencv.hpp>头文件找不到]

Opencv的介绍
OpenCV ,是一个开源的跨平台计算机视觉和机器学习库,通俗点的说,就是他给计算机提供了一双眼睛,一双可以从图片中获取信息的眼镜,从而完成人脸识别、去红眼、追踪移动物体等等的图像相关的功能。更多具体的说明可参见 OpenCV 官网->http://opencv.org

Opencv库模块划分
你可以去opencv官网下载最新的支持包 http://opencv.org/downloads.html

这是官方库中重要几个模块
core:简洁的核心模块,定义了基本的数据结构,包括稠密多维数组 Mat 和其他模块需要的基本函数。
imgproc:图像处理模块,包括线性和非线性图像滤波、几何图像转换 (缩放、仿射与透视变换、一般性基于表的重映射)、颜色空间转换、直方图等等。
video:视频分析模块,包括运动估计、背景消除、物体跟踪算法。
calib3d:包括基本的多视角几何算法、单体和立体相机的标定、对象姿态估计、双目立体匹配算法和元素的三维重建。
features2d:包含了显著特征检测算法、描述算子和算子匹配算法。
objdetect:物体检测和一些预定义的物体的检测 (如人脸、眼睛、杯子、人、汽车等)。
ml:多种机器学习算法,如 K 均值、支持向量机和神经网络。
highgui:一个简单易用的接口,提供视频捕捉、图像和视频编码等功能,还有简单的 UI 接口 (iOS 上可用的仅是其一个子集)。
gpu:OpenCV 中不同模块的 GPU 加速算法 (iOS 上不可用)。
ocl:使用 OpenCL 实现的通用算法 (iOS 上不可用)。
一些其它辅助模块,如 Python 绑定和用户贡献的算法。

基础类和操作
OpenCV有几百个类,几个核心类可以参考文档:http://docs.opencv.org/modules/core/doc/core.html

cv::Mat:核心数据结构,可以用来表示N维矩阵,图像是2维矩阵的,cv::Mat是OpenCV中用的最多的。一个cv::Mat实例作用就是图像数据头,包含图像格式信息。图像中任一像素地址都可通过下面的指针运算得到:
uchar *pixelPtr = cvMat.data + rowIndex * cvMat.step[0] + colIndex * cvMat.step[1]

每个像素的数据格式可以通过type()方法获得,这些数据格式包括:

常用的每通道8位无符号整数的灰度图(1通道,CV_8UC1)
常用的彩色图(3通道,CV_8UC3)
不常用的CV_16SC3(每像素3通道,每通道使用16位有符号整数)
不常用的CV_64FC4(每像素4通道,每通道使用64位浮点数)
cv::Algorithm:很多算法的抽象基类。

关于opencv介绍就到这,本文重头戏在于iOS的使用

iOS 与 opencv 交互
添加到自己的工程中
(1)CocoaPods:pod “OpenCV"
(2)下载官方iOS包:http://opencv.org/downloads.html
(3)在GitHub下代码自己编译:GitHub地址https://github.com/Itseez/opencv,编译教程http://docs.opencv.org/doc/tutorials/introduction/ios_install/ios_install.html#ios-installation

因为opens库的底层是由C++源码写成,得盈于苹果爸爸,Xcode也是编译C++,使得iOS比安卓更加容易兼容Opencv,但是在使用中也需注意一些配置

配置(一):
添加一个PCH文件,在PCH文件中:
#import <Availability.h>
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
#ifdef OBJC
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#endif

配置(二):

关于XcodeC++配置.png

这个地方的配置必须这样才能使工程编译通过

配置(三):

OC中使用到OpencvC++源码的控制器.png

PS:OpenCV 是一个 C++ 的 API,因此不能直接在 Swift 和 Objective-C 代码中使用,但能在 Objective-C++ 文件中使用。
Objective-C++ 是 Objective-C 和 C++ 的混合物,让你可以在 Objective-C 类中使用 C++ 对象。clang 编译器会把所有后缀名为.mm 的文件都当做是 Objective-C++。一般来说,它会如你所期望的那样运行,但还是有一些使用 Objective-C++ 的注意事项。内存管理是你最应该格外注意的点,因为 ARC 只对 Objective-C 对象有效。当你使用一个 C++ 对象作为类属性的时候,其唯一有效的属性就是 assign。因此,你的 dealloc 函数应确保 C++ 对象被正确地释放了。
第二重要的点就是,如果你在 Objective-C++ 头文件中引入了 C++ 头文件,当你在工程中使用该 Objective-C++ 文件的时候就泄露了 C++ 的依赖。任何引入你的 Objective-C++ 类的 Objective-C 类也会引入该 C++ 类,因此该 Objective-C 文件也要被声明为 Objective-C++ 的文件。这会像森林大火一样在工程中迅速蔓延。所以,应该把你引入 C++ 文件的地方都用 #ifdef __cplusplus包起来,并且只要可能,就尽量只在 .mm 实现文件中引入 C++ 头文件。

到这里opencv适配Xcode工程就基本适配完了,关于opencv使用将在下一篇文章讲到,近期公司项目安排有点紧,估计下篇得在这周末完成了.

上一篇下一篇

猜你喜欢

热点阅读