如何在 iOS 工程中使用 OpenCV

在MacOS和iOS系统中使用OpenCV 在MacOS和iOS系统中使用OpenCV OCT 27TH, 2012 前言 OpenCV 是一个开源的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。 最近试着在MacOS和iOS上使用OpenCV,发现网上关于在MacOS和iOS上搭建OpenCV的资料很少。好不容易搜到些资料,却发现由于OpenCV和XCode的版本更新,变得不再有用了 阅读详情

转:https://segmentfault.com/a/1190000003105187



前言

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

导入工程

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

#import <opencv2/opencv.hpp>

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

#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif

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

实际问题

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

另外注意另一个问题:如果一个头文件是C++类型的头文件,那么一定要保证所有直接或者间接引用这个头文件的实现文件都要为.mm或者.cpp,否则 Xcode 就不会把这个头文件当做 C++头文件来编译,就会出现最基本的#include <iostream>这种引用都会报出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;
 }
Xcode 配置 OpenCV for iOS 1.在OpenCV 官网下载OpenCV for iOS,文件如下图: 2.打开Xcode工程,添加opencv2.framework到工程中: 点击“target”,在“General”下面的“Linked Frameworks and Libraries”中点击“+”号,找到opencv2.framework文件的位置加入即可。 3.修改预编译头文件,也即supporti 阅读详情

相关推荐

iOS平台上的OpenCV入门应用

在这里,我们使用OpenCV将每个帧转换为灰度图像,并将结果显示在UIImageView中。如果你在学习iOS开发,并且对计算机视觉感兴趣,那么使用OpenCV是一个不错的选择。总之,OpenCV是一个强大的计算机视觉库,可用于iOS平台上的图像和视频处理。我们可以使用CocoaPods轻松地将OpenCV集成到我们的项目中,并使用OpenCV API轻松地操作图像。完成这些步骤后,我们就可以编译并运行应用程序。启动应用程序后,您应该可以看到摄像头捕获到的实时图像以及相应的灰度图像。

pytorchCode的博客 711

iOS项目集成OpenCV及踩过的坑

那如果你在Objective-C的类B.m中导入使用,此时编译器会认为此时A.mm也按照Objective-C类型编译,你必须把B.m类型更改为B.mm类型才不会报错,以此类推,★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。OpenCV框架提供是C++的API接口,凡是使用OpenCV的地方,类的文件类型必须由.m类型改为.mm类型,这时候编译器按照OC与C++混编进行编译。

yinshipin007的博客 1296

在iOS工程中使用OpenCV库的完整步骤

将解压缩的opencv2.framework文件夹拖放到你的工程目录中。本文将介绍在iOS工程中使用OpenCV库的完整步骤,包括库的导入、配置和简单示例代码的编写。选择你的工程目标,然后转到"Build Settings"选项卡。然后,转到"Build Phases"选项卡,并展开"Link Binary With Libraries"部分。在你的工程中创建一个Objective-C或Swift源文件,并编写一些示例代码来使用OpenCV库。确保选择正确的项目模板和设置,以便创建适合你的应用程序的工程。

TechInk的博客 1207

iOS 异常处理 - Undefined symbols

作为iOS开发中最常见的问题之一,今天好好来把它拎清一下!OC基于C语言,是扩充C的面向对象编程语言。有.h和.m文件,.h头文件中是对定义的声明,而.m中则是具体的实现逻辑代码。

weixin_43149049的博客 7487

IOS工程使用OpenCV库完整步聚

在下图的Prefix Header 中添加 $(SRCROOT)/PrefixHeader.pch。选择OpenCV源码编译生成输入的IOS平台的opencv2.framework库。成功添加opencv库的引用,现在可在工程中使用opencv库的功能了。2.引用编译好的opencv2.framework框架。添加CoreGraphics.framework库。创建预编译头文件PrefixHeader.pch。opencv库要放在工程目录下,不然会找不到。添加libc++.tbd。mm文件显示 为m+

2009

WorldPop数据集

WorldPop数据集介绍

qq_43874102的博客 1万+

OpenCV在iOS端的集成及Mat和UIImage互相转化(附源码)

使用的命名空间也需要额外声明。有想法欢迎交流,等你。

mumubumaopao的博客 1810

Unity详细介绍说明限制Unity帧率的方式

在Unity开发中,帧率(FPS,Frames per Second)是一个非常重要的表现标准,它直接影响了游戏运行的流畅度。在某些应用场景里,我们可能需要手动限制帧率。限制帧率可以减少电脑的CPU和GPU负载,使运行更加稳定,同时对于移动设备来说还能有效降低电量消耗。下面就详细介绍几种限制Unity中帧率的方式。

zjw1349547081的专栏 5433

Xcode 开发 opencv 遇到的坑和解决办法

Mac Opencv开发环境 与 报错解决

u011708778的专栏 3109

lighttools用透镜旋转手动创建菲尼尔透镜

学过很多软件,都没有留下痕迹,很多年之后只记得学过的软件常用的一些功能,稍微难一些的再次用起需要重新学,但如果留下点痕迹,重新再用就会很快。lighttools无意之中接触了,记一点点笔记吧。...

kingsai2012的博客 4329

wireshark提取视频数据之RTP包中提取H264和H265

本文主要描述从wireshark包数据中提取出H264和H265裸流数据方法,裸流通过RTP封包方式发送,从抓包中直接提取视频流数据,进而进行流媒体问题定位

技术控的笔记 17万+

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

前言OpenCV ,是一个开源的跨平台计算机视觉和机器学习库,通俗点的说,就是他给计算机提供了一双眼睛,一双可以从图片中获取信息的眼镜,从而完成人脸识别、去红眼、追踪移动物体等等的图像相关的功能。更多具体的说明可参见 OpenCV 官网。导入工程导入 OpenCV 到 Xcode 的工程中还是比较简单的,从官网下载对应的 framework,直接丢到 Xcode 的工程中,然后在你想用 OpenC...

weixin_29876341的博客 1081

PyTorch深度学习实战(1)——神经网络与模型训练过程详解

在本节中,我们将了解传统机器学习与人工神经网络间的差异,并了解如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现反向传播以优化权重达到最小化损失值的目标。并将实现网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 9万+

如何在 iOS 工程中使用 OpenCV?

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

weixin_33810006的博客 237

2026.2.23:AgentScope框架实战<一>:安装并使用agentscope

本文介绍了AgentScope框架的安装与使用实践。通过PyPI安装agentscope[full]后,演示了如何创建ReActAgent代理:1)配置DashScope聊天模型;2)注册自定义工具函数(查询位置和天气);3)初始化代理并处理用户请求。示例展示了代理如何响应复合查询(如同时获取北京位置和天气信息),输出结果显示代理成功执行了工具调用并返回结构化响应。该框架支持Python 3.13环境,提供内存管理、工具集成等功能,适用于构建智能代理系统。

拥抱具身智能,昇腾Ascend C 504

Python爬虫实战:高效爬取华尔街日报文章的技术与代码详解

在当今信息爆炸的时代,金融数据和分析对于投资者、研究人员和企业决策者来说至关重要。华尔街日报(WSJ)作为全球最具影响力的财经媒体之一,其文章内容具有极高的价值。本文将详细介绍如何使用Python最新技术构建一个高效、稳定的华尔街日报文章爬虫,涵盖从基础到高级的各种技术要点。本文详细介绍了如何使用Python最新技术构建一个高效、稳定的华尔街日报文章爬虫。我们从基础爬虫实现开始,逐步添加了高级功能如分布式处理、反反爬虫策略、数据清洗和存储等。异步处理:使用asyncio和httpx实现高性能网络请求。

2201_76125261的博客 385

如何从零开始搭建openCV IOS 工程

如何从零开始搭建openCv IOS 工程

x32sky的专栏 7336

Ardupilot二次开发(二):自定义mavlivk消息

在下面的文件添加自定义消息的xml定义然后编译固件,会生成相应的消息头文件。

超维空间科技的博客 2312

openCV IOS 工程 识别数字

http://opencv.org 官网下载ios framework库 https://sourceforge.net/projects/libjpeg-turbo/files/1.4.0/ 下载libjpeg-turbo-1.4.0.dmg  在终端运行:lipo -info /opt/libjpeg-turbo/lib/libjpeg.a 将会出现以下内容:  A

ssyyjj88的专栏 1249

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

openCV(一)---将openCV框架导入iOS工程中

开发环境: Xcode 6.4 openCV for iOS 3.0 配置openCV开发环境 在OpenCV官网中下载OpenCV开发包(官网地址:http://opencv.org/) 1.新建项目,Single View Application 2.TARGETS -> General -> Linked Frameworks and Li...

weixin_30855099的博客 255

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

使用OpenCV开发iOS图像处理应用

呃,OpenCV(中文)是Intel主导的开源图像处理函数库,基于C语言编写,是图像处理领域居家旅行必备、男女老少咸宜的开发库。 上学的时候用OpenCV做过图像处理方面的开发,现在刚接触iOS,了解了一下OpenCV在iOS平台的配置和开发方法,配置过程和遇到的问题简单做一下记录。 环境配置 OpenCV src 首先把最新版本的OpenCV代码下载或co到本地,比如我把

TianYaSiShui的专栏 1139

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

一个在ios当中采用ObjectC和opencv来显示图片的实例

在ios中采用ObjectC编程利用opencv来显示一张图片,并简单绘图。听上去似乎不难,但是实际操作下来,却不是非常的容易的。本文较为详细的描述了这个过程,供后续参考。

1574

[转]在MacOS和iOS系统中使用OpenCV

OpenCV是一个开源的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。 最近试着在MacOS和iOS上使用OpenCV,发现网上关于在MacOS和iOS上搭建OpenCV的资料很少。好不容易搜到些资料,却发现由于OpenCV和XCode的版本更新,变得不再有用了。有些问题费了我很多时间,在此总结分享给大家,希望后来人少走些弯路。 可以预见到,随着XCode和OpenCV的...

weixin_30588729的博客 120

opencv在iOS 中的使用

在 iOS 文件中引用 opencv 库的一些步骤。

水木姚姚个人主页:知乎同名个人主页:https://www.zhihu.com/people/66-64-1-50 853

8、IOS OpenCV环境搭建

在IOS中使用OpenCV需要先配置OpenCV的环境,配置环境较为简单,只需要几步就可以。 1、创建一个IOS工程,我们这里使用的是xcode6。 2、下载OpenCV的framework,网址:http://opencv.org/downloads.html 3、在Build Phases中的Link Binary With Libraries中添加OpenCV的framework

逆袭的青年的专栏 1204
上一篇: 合成全景图中计算机视觉技术的知识和原理
下一篇: OpenCV: 特征点检测与图像匹配
直隶码农
博客等级 码龄19年 95粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值