前言

OpenCV ,是一个开源的跨平台计算机视觉和机器学习库,通俗点的说,就是他给计算机提供了一双眼睛,一双可以从图片中获取信息的眼镜,从而完成人脸识别、去红眼、追踪移动物体等等的图像相关的功能。更多具体的说明可参见 OpenCV 官网。

导入工程

导入 OpenCV 到 Xcode 的工程中还是比较简单的,从官网下载对应的 framework,直接丢到 Xcode 的工程中,然后在你想用 OpenCV 的地方引入 OpenCV 的头文件:

#import

或者直接在 PCH 文件中添加:

#ifdef __cplusplus

#import

#endif

然后把使用到 OpenCV 中 C++方法的实现文件后缀名改成.mm,就可以开始使用 OpenCV 的方法了。看起来很简单,对吧?确实是很简单,不过这里有一些要注意的地方,我们一起来看看。

实际问题

首先说明,为何在 PCH 文件中引入 OpenCV 的头文件我们需要多加#ifdef __cpluseplus这一部分呢?这是因为 PCH 文件是一个会被所有的文件引入的头文件,而我们又希望 #import 这部分只会被一些 C++实现文件编译,所以我们加上#ifdef __cpluseplus来表示这是 C++ 文件才会编译的,除了#ifdef __cpluseplus,还有#ifdef __OBJC__这样的宏来说明编译规则(按照 OC 文件编译),这样的宏多出现于一些会被多种类型的实现文件引用的头文件中。

另外注意另一个问题:如果一个头文件是C++类型的头文件,那么一定要保证所有直接或者间接引用这个头文件的实现文件都要为.mm或者.cpp,否则 Xcode 就不会把这个头文件当做 C++头文件来编译,就会出现最基本的#include 这种引用都会报出file not found这样的编译错误的问题。我在编译的过程中,某个C++头文件 A.h 被 B.h 引用,然后 B.h 又被 C.m 引用,虽然 B 的实现文件是 B.mm ,但是仍然报出了之前说的那个错误, 感谢 StackOberflow 让我找到了问题发生的原因。所以对于 C++ 头文件的引用一定要注意,但凡是引用了 A.h 的实现部分,都必须是.mm或者.cpp后缀名。(同时我们也可以知道,Xcode 是根据头文件被引用的情况来判定头文件的编译 类型的)。

转换 UIImage 和 cv::Mat

在 OpenCV 中同常用 cv::Mat 表示图片,而 iOS 中则是 UIImage 来表示图片,因此我们就需要一些转换的方法,OpenCV 的官方教程中给吃了转换的方法,这里摘录如下:

UIImage To cv::Mat:

- (cv::Mat)cvMatFromUIImage:(UIImage *)image

{

CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);

CGFloat cols = image.size.width;

CGFloat rows = image.size.height;

cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha)

CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to data

cols, // Width of bitmap

rows, // Height of bitmap

8, // Bits per component

cvMat.step[0], // Bytes per row

colorSpace, // Colorspace

kCGImageAlphaNoneSkipLast |

kCGBitmapByteOrderDefault); // Bitmap info flags

CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);

CGContextRelease(contextRef);

return cvMat;

}

cv::Mat To UIImage:

-(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat

{

NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];

CGColorSpaceRef colorSpace;

if (cvMat.elemSize() == 1) {//可以根据这个决定使用哪种

colorSpace = CGColorSpaceCreateDeviceGray();

} else {

colorSpace = CGColorSpaceCreateDeviceRGB();

}

CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

// Creating CGImage from cv::Mat

CGImageRef imageRef = CGImageCreate(cvMat.cols, //width

cvMat.rows, //height

8, //bits per component

8 * cvMat.elemSize(), //bits per pixel

cvMat.step[0], //bytesPerRow

colorSpace, //colorspace

kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info

provider, //CGDataProviderRef

NULL, //decode

false, //should interpolate

kCGRenderingIntentDefault //intent

);

// Getting UIImage from CGImage

UIImage *finalImage = [UIImage imageWithCGImage:imageRef];

CGImageRelease(imageRef);

CGDataProviderRelease(provider);

CGColorSpaceRelease(colorSpace);

return finalImage;

}

ios opencv图片处理_如何在 iOS 工程中使用 OpenCV?相关推荐

  1. python基于opencv的手势识别_怎么在Python3.5 中利用OpenCV实现一个手势识别功能

    怎么在Python3.5 中利用OpenCV实现一个手势识别功能 发布时间:2020-12-22 11:56:32 来源:亿速云 阅读:67 作者:Leah 怎么在Python3.5 中利用OpenC ...

  2. java opencv 开发环境_在IntelliJ IDEA 13中配置OpenCV的Java开发环境

    准备工作: 下载IDEA 13(这里以版本13为例,后面简称IDEA): 下载Java JDK(用于配置基本的Java开发环境): 下载OpenCV 2.4.9(这里以版本2.4.9为例,据这篇文章说 ...

  3. ios 拍照 实现 连拍_如何在iOS设备上使用连拍模式拍照

    ios 拍照 实现 连拍 We're sure you've tried to capture that perfect moment with your camera and you're just ...

  4. ios 长按 放大镜_如何在iOS 10中将iPhone的相机用作放大镜

    ios 长按 放大镜 If you've ever found yourself wishing you had a magnifying glass with you, iOS 10 can now ...

  5. 移动应用ios和网页应用_如何在iOS上一次移动多个应用

    移动应用ios和网页应用 Apple doesn't really believe in detailed instruction manuals, so some handy tricks slip ...

  6. ios备份应用数据_如何在iOS设备之间备份和复制数据

    ios备份应用数据 Although iTunes usually does a good enough job backing up your data, the backups are encry ...

  7. ios 控件徽章_如何在iOS 8中正确设置应用程序徽章值?

    KepPM.. 22 以前帖子的附加信息(完整版registerUserNotificationSettings): Apple为注册通知和使用徽章制作了新的API. 请参阅WWDC 2014会话视频 ...

  8. ios保存gif到相册_如何在iOS中保存和下载GIF图片

    对于大多数移动开发人员来说,他们经常处理图片,而png和jpg是开发人员经常遇到的图片类型. 但是,对于gif图片怎么存gif图,由于iOS系统不支持直接处理gif,因此处理起来会更加麻烦. 本文将讨 ...

  9. web dialog 内嵌 图片_Unity游戏如何在iOS上调用Facebook原生对话框分享图片

    原文发表于Unity中国论坛 ,如果对你有帮助请关注我! Unity游戏如何在iOS上调用Facebook原生对话框分享图片 - Unity​unity.cn 手头上的一个游戏项目需要实现截屏并分享到 ...

最新文章

  1. FFmpeg windows软件开发环境搭建
  2. layui table 设置滚动条
  3. 每日一程-10.五种基本随机数测试-续
  4. 电子测量与仪器第二次作业
  5. matlab插值与拟合例题_菜鸟进阶系列:MATLAB数学建模·数据插值与拟合
  6. hdu 3887 Counting Offspring
  7. 机器人 工具坐标系的标定
  8. 删除顺序表中指定值的所有元素(C++,vector)
  9. 双11肯德基星巴克在饿了么各卖出2亿元
  10. eclipse非主窗口的停靠(正常), 恢复, 最小化, 最大化的切换
  11. Linux系统架构与目录解析 pdf版,Linux系统架构与目录解析
  12. MessageBox.Show常用的2个方法
  13. Java过滤器与拦截器的区别
  14. 在虚拟机里通过U盘引导安装Win10教程
  15. 微信小程序--火车票查询
  16. 690-文件管理和文件系统
  17. Activity简单几步支持向右滑动返回
  18. 反爬与反反爬常见知识点
  19. 石化行业安全生产调度解决方案
  20. SpecCPU2017 测试cpu性能

热门文章

  1. MOS管开关时的米勒效应
  2. Cerebral Cortex:注意缺陷多动障碍ADHD多层网络动态重构分析
  3. 说文解字----矩阵分析(一)矩阵中的空间与秩
  4. python妙用桌面计算器
  5. python桌面宠物_如何从零开始制作智能桌宠?
  6. win11右键菜单怎么回到win10旧版
  7. 微信小程序家庭记账本开发进度七
  8. wget 递归下载整个网站
  9. 360断网工具箱简单分析
  10. [AS/400] 基本概念