美文网首页iOS开发大神总结
iOS与Opencv的探秘之Opencv认识,适配Xcode

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

作者: iOS_ZK03 | 来源:发表于2017-03-22 14:14 被阅读633次

    本章及以后文章所采用的开发环境:
    (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使用将在下一篇文章讲到,近期公司项目安排有点紧,估计下篇得在这周末完成了.

    相关文章

      网友评论

      • 不知蜕变的挣扎:Mat padded = Mat(); 我使用Mat这个函数 编译就提示,库都导入了
        Use of undeclared identifier 'Mat'
        Unknown type name 'Mat'; did you mean 'cv::Mat'? Replace 'Mat' with 'cv::Mat'
        iOS_ZK03:opencv使用它的对象时,前面都是以CV:调用,直接使用MAT对象没使用过,你写的是OC程序吗??
      • 失忆的程序员:关于摄像头远近调整,你研究过没
        iOS_ZK03:这个没有深入了解,如果你找到方法希望可以分享下
      • 梵高的老巫婆:你好我集成的opencv2.framework 添加到项目中,运行时报好多unknow type name an NSString 能加个联系方式请教下吗 ?
      • 482d026cadbf:使用下载的 framework 集成失败...
        itmarsung:我的添加framework也是失败,用的Xcode 9。请问这个问题怎么解决
        iOS_ZK03:什么错误??缺少文件?还是

      本文标题:iOS与Opencv的探秘之Opencv认识,适配Xcode

      本文链接:https://www.haomeiwen.com/subject/ngcavttx.html