如何在 iOS 工程中使用 OpenCV

简介: 如何在 iOS 工程中使用 OpenCV

前言


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指令。 目前正在积极开发功能齐全的 CUDAOpenCL接口。有500多种算法,而构成或支持这些算法的功能大约是其10倍。OpenCV用C ++原生编写,并具有可与STL容器无缝配合的模板化接口。

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


导入工程


一、手动导入


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


二、Pod导入


pod 'OpenCV', '~> 4.0.0'


三、文件使用


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

1.png


四、引入头文件

#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.png


系列文章关联


1、如何在 iOS 工程中使用 OpenCV

2、iOS使用OpenCV之调整图片亮度和对比度(一)

3、iOS使用OpenCV之图像融合(二)

4、iOS使用OpenCV之滤波处理(三)


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


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

相关文章
|
8月前
|
iOS开发
iOS Xcode 意外退出 打不开工程
iOS Xcode 意外退出 打不开工程
109 0
|
缓存 中间件 Swift
优酷iOS工程插件化 -- 大量模块壳工程本地如何快速编译
业务快速发展,优酷工程已有大量模块,模块耦合严重且混乱,模块依赖是一颗“树”,甚至于一张“网” ,导致开发体验持续严重下降,如何解决本地调试效率低、不支持模拟器、模块整包依赖不一致等等痛点问题,文中进行了说明。
53975 6
|
文字识别 算法 Swift
毕业设计在iOS上使用OpenCV实现图片中的文字框选文字识别
毕业设计在iOS上使用OpenCV实现图片中的文字框选文字识别
468 0
毕业设计在iOS上使用OpenCV实现图片中的文字框选文字识别
|
算法 计算机视觉 iOS开发
iOS使用OpenCV之滤波处理(三)
iOS使用OpenCV之滤波处理(三)
iOS使用OpenCV之滤波处理(三)
|
算法 计算机视觉 iOS开发
iOS使用OpenCV之图像融合(二)
iOS使用OpenCV之图像融合(二)
iOS使用OpenCV之图像融合(二)
|
算法 计算机视觉 iOS开发
iOS使用OpenCV之调整图片亮度和对比度(一)
iOS使用OpenCV之调整图片亮度和对比度(一)
iOS使用OpenCV之调整图片亮度和对比度(一)
|
iOS开发 Perl
iOS 同一个工程创建不同的多版本切换应用
iOS 同一个工程创建不同的多版本切换应用
iOS 同一个工程创建不同的多版本切换应用
|
Swift iOS开发
iOS开发 - 适合工程多环境切换(swift环境),适合经常打很多不同环境包的人
iOS开发 - 适合工程多环境切换(swift环境),适合经常打很多不同环境包的人
219 0
iOS开发 - 适合工程多环境切换(swift环境),适合经常打很多不同环境包的人
|
测试技术 Swift iOS开发
iOS开发 - 一个工程多环境切换,适合需要经常打很多不同环境包的人
iOS开发 - 一个工程多环境切换,适合需要经常打很多不同环境包的人
294 0
iOS开发 - 一个工程多环境切换,适合需要经常打很多不同环境包的人
|
缓存 中间件 Swift
优酷iOS工程插件化 -- 大量模块壳工程本地如何快速编译
随着优酷业务的快速发展,随之而来的是模块数量的爆发式增长,基本每年以大量新增模块的速度增加,到目前为止优酷已经有非常庞大的模块依赖。模块之间通信往往是相互直接依赖调用,以至于耦合十分严重且混乱,每一个库依赖都是一棵“树”,甚至于一张“网”,对日常研发造成很多困扰:
501 0
优酷iOS工程插件化 -- 大量模块壳工程本地如何快速编译