前言
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; }
系列文章关联
接下来我会慢慢补充Opencv的相关文章,暂时已将常见的图片处理和图片算法封装出来,有需要的朋友可以去pod 'OpencvQueen'