如何在 iOS 工程中使用 OpenCV

前言

  • OpenCV(開源計算機視覺庫)是一個開源計算機視覺和機器學習軟件庫,能夠完成圖片處理、人臉識別、去紅眼、追蹤移動物體等等的圖像相關的功能。更多具體的說明可參見 OpenCV 官網

該庫具備2500多種優化算法,其中包括一整套經典和最新的計算機視覺和機器學習算法。這些算法可用於檢測和識別人臉,識別對象,對視頻中的人爲行爲進行分類,跟蹤攝像機的運動,跟蹤運動的對象,提取對象的3D模型,從立體攝像機生成3D點雲,將圖像拼接在一塊兒以產生高分辨率整個場景的圖像,從圖像數據庫中查找類似的圖像,從使用閃光燈拍攝的圖像中消除紅眼,跟隨眼睛的移動,識別風景並創建標記以將其與加強現實疊加在一塊兒等。OpenCV擁有超過4.7萬人的用戶社區,下載量估計超過 1800萬。該庫在公司,研究小組和政府機構中獲得普遍使用。html

除了使用該庫的Google,Yahoo,Microsoft,Intel,IBM,Sony,Honda,Toyota之類的知名公司外,還有許多新興公司(例如Applied Minds,VideoSurf和Zeitera)普遍使用OpenCV。OpenCV的部署用途包括將街景圖像拼接在一塊兒,檢測以色列監視視頻中的入侵,監視中國的礦山設備,幫助機器人在Willow Garage導航和拾取物體,檢測歐洲游泳池溺水事故,在西班牙和紐約,在土耳其檢查跑道上的碎屑,檢查世界各地工廠產品上的標籤,而後在日本進行快速人臉檢測。android

它具備C ++,Python,Java和MATLAB接口,並支持Windows,Linux,  Android 和Mac OS。OpenCV主要傾向於實時視覺應用,並在可用時利用MMX和SSE指令。 目前正在積極開發功能齊全的 CUDA和 OpenCL接口。有500多種算法,而構成或支持這些算法的功能大約是其10倍。OpenCV用C ++原生編寫,並具備可與STL容器無縫配合的模板化接口。ios

今天咱們就來聊聊怎麼樣在iOS上面配置和使用Opencv框架c++

導入工程

1、手動導入

能夠從官網下載對應的 framework,直接丟到 Xcode 的工程中git

2、Pod導入

pod 'OpenCV', '~> 4.0.0'
複製代碼

3、文件使用

使用到 OpenCV 中 C++方法的實現文件後綴名改爲.mm,就能夠開始使用 OpenCV 的方法 github

4、引入頭文件

#if __has_include(<opencv2/imgcodecs/ios.h>)

#include <iostream>
#import <opencv2/imgcodecs/ios.h>
#import <opencv2/core.hpp>
#import <opencv2/highgui.hpp>
#import <opencv2/imgproc.hpp>

using namespace cv;
using namespace std;
@implementation UIImage (KJOpencv)

...

@end
#endif
複製代碼

5、UIImage轉C++圖片

在 OpenCV 中同經常使用 cv::Mat 表示圖片,而 iOS 中則是 UIImage 來表示圖片,所以咱們就須要一些轉換的方法算法

cv::Mat src;
UIImageToMat(self,src,true);
複製代碼

6、將結果C++圖片轉換爲UIImage

/* 將c++圖片轉換爲UIImage */
NS_INLINE UIImage * kMatToUIImage(const cv::Mat &image) {
    NSData *data = [NSData dataWithBytes:image.data length:image.elemSize()*image.total()];
    CGColorSpaceRef colorSpace;
    if (image.elemSize() == 1) {
        colorSpace = CGColorSpaceCreateDeviceGray();
    }else{
        colorSpace = CGColorSpaceCreateDeviceRGB();
    }
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
    bool alpha = image.channels() == 4;
    //kCGImageAlphaPremultipliedLast保留透明度
    CGBitmapInfo bitmapInfo = (alpha ? kCGImageAlphaPremultipliedLast : kCGImageAlphaNone) | kCGBitmapByteOrderDefault;
    CGImageRef imageRef = CGImageCreate(image.cols,
                                        image.rows,
                                        8,
                                        8 * image.elemSize(),
                                        image.step.p[0],
                                        colorSpace,
                                        bitmapInfo,
                                        provider,
                                        NULL,
                                        false,
                                        kCGRenderingIntentDefault);
    UIImage *newImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);
    return newImage;
}
複製代碼

系列文章關聯

一、如何在 iOS 工程中使用 OpenCV
二、iOS使用OpenCV之調整圖片亮度和對比度(一)
三、iOS使用OpenCV之圖像融合(二)
四、iOS使用OpenCV之濾波處理(三)數據庫

接下來我會慢慢補充Opencv的相關文章,暫時已將常見的圖片處理和圖片算法封裝出來,有須要的朋友能夠去pod 'KJExtensionHandler/Opencv'markdown

如何在 iOS 工程中使用 OpenCV介紹就到此完畢,後面有相關再補充,寫文章不容易,還請點個**小星星**傳送門

相關文章
相關標籤/搜索