如何在 iOS 工程中使用 OpenCV

5,114 阅读3分钟

前言

  • OpenCV(开源计算机视觉库)是一个开源计算机视觉和机器学习软件库,可以完成图片处理、人脸识别、去红眼、追踪移动物体等等的图像相关的功能。更多具体的说明可参见 OpenCV 官网

该库具有2500多种优化算法,其中包括一整套经典和最新的计算机视觉和机器学习算法。这些算法可用于检测和识别人脸,识别对象,对视频中的人为行为进行分类,跟踪摄像机的运动,跟踪运动的对象,提取对象的3D模型,从立体摄像机生成3D点云,将图像拼接在一起以产生高分辨率整个场景的图像,从图像数据库中查找相似的图像,从使用闪光灯拍摄的图像中消除红眼,跟随眼睛的移动,识别风景并建立标记以将其与增强现实叠加在一起等。OpenCV拥有超过4.7万人的用户社区,下载量估计超过 1800万。该库在公司,研究小组和政府机构中得到广泛使用。

除了使用该库的Google,Yahoo,Microsoft,Intel,IBM,Sony,Honda,Toyota之类的知名公司外,还有许多新兴公司(例如Applied Minds,VideoSurf和Zeitera)广泛使用OpenCV。OpenCV的部署用途包括将街景图像拼接在一起,检测以色列监视视频中的入侵,监视中国的矿山设备,帮助机器人在Willow Garage导航和拾取物体,检测欧洲游泳池溺水事故,在西班牙和纽约,在土耳其检查跑道上的碎屑,检查世界各地工厂产品上的标签,然后在日本进行快速人脸检测。

它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,  Android 和Mac OS。OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令。 目前正在积极开发功能齐全的 CUDA和 OpenCL接口。有500多种算法,而构成或支持这些算法的功能大约是其10倍。OpenCV用C ++原生编写,并具有可与STL容器无缝配合的模板化接口。

今天我们就来聊聊怎么样在iOS上面配置和使用Opencv框架

导入工程

一、手动导入

可以从官网下载对应的 framework,直接丢到 Xcode 的工程中

二、Pod导入

pod 'OpenCV', '~> 4.0.0'

三、文件使用

使用到 OpenCV 中 C++方法的实现文件后缀名改成.mm,就可以开始使用 OpenCV 的方法

四、引入头文件

#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

五、UIImage转C++图片

在 OpenCV 中同常用 cv::Mat 表示图片,而 iOS 中则是 UIImage 来表示图片,因此我们就需要一些转换的方法

cv::Mat src;
UIImageToMat(self,src,true);

六、将结果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;
}

系列文章关联

1、如何在 iOS 工程中使用 OpenCV
2、iOS使用OpenCV之调整图片亮度和对比度(一)
3、iOS使用OpenCV之图像融合(二)
4、iOS使用OpenCV之滤波处理(三)

接下来我会慢慢补充Opencv的相关文章,暂时已将常见的图片处理和图片算法封装出来,有需要的朋友可以去pod 'OpencvQueen'

如何在 iOS 工程中使用 OpenCV介绍就到此完毕,后面有相关再补充,写文章不容易,还请点个**小星星**传送门