iOS与Opencv的探秘之Opencv认识,适配Xcode
本章及以后文章所采用的開發環境: (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
配置(二):
這個地方的配置必須這樣才能使工程編譯通過
配置(三):
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使用將在下一篇文章講到,近期公司項目安排有點緊,估計下篇得在這周末完成了.
轉載于:https://juejin.im/post/5a3ce1f96fb9a044fc44efdd
總結
以上是生活随笔為你收集整理的iOS与Opencv的探秘之Opencv认识,适配Xcode的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日期时间类型
- 下一篇: linux运维相关操作(centos/U