文档章节

在iPhone上使用 OpenCV

abcMx
 abcMx
发布于 2013/09/05 17:13
字数 1091
阅读 206
收藏 5


2012-08-02 01:08

  原文:http://niw.at/articles/2009/03/14/using-opencv-on-iphone/en

  Posted by Yoshimasa Niwaon 03/14, 2009

  图片

  OpenCV是intel开发的计算机视觉库,例如我们可以用它轻易地实现面部识别。本文介绍如何在iOS中使用OpenCV,包括脚本的编译及一个demo示例程序。上面的截图就取自这个demo。

  OpenCV最新版本及所支持的iOSSDK

  OpenCV 最新版本为2.2.0,它支持iOSSDK 4.3, Xcode 4 (04/17/2011更新)

  开始

  所有代码和资源都是开放的,你可以从这里下载:

  my githubrepository.

  它包括一个已编译好的OpenCV库和头文件。你可以轻易就使用它。如果你安装了git,可以从github克隆整个存储库。否则,可从github下载压缩包并解压缩。

  % git clone git://github.com/niw/iphone_opencv_test.git

  获得源代码之后,用Xcode打开OpenCVTest项目并编译它。你可以用iPhone或者iPhone模拟器运行这个demo。

  编译OpenCV库

  你可以用gcc编译器直接从源代码编译生成OpenCV的二进制版本。为了节省你的时间,我写了一个脚本。由于iOSSDL不支持向.framework这样的动态链接库,所以我们不得不以“静态库”的方式将OpenCV连接到你的app中。

  编译OpenCV需要使用CMake。你可以用Homebrew或者MacPorts来安装CMake,即:

  Homebreww

  brew install cmake

  或者

  MacPorts

  sudo port install cmake –gui

  如果你已经安装了最新的Java update,可能会问让你安装javadeveloper_10.6_10m3261.dmg。这是因为cmake需要用到jni.h,但在后来的Java update中已经把它删除了。在这里 here for Mac OS X10.6 可以下载到它(需要订阅Apple Developer Connection). 同时, 苹果将在MacOSX中抛弃Java going to deprecateJava on MacOS X (10/30/2010更新).

  从 sourceforge获得OpenCV。 我使用的是OpenCV-2.2.0.tar.bz2.

  在demo 项目的根目录解压缩: tar xjvf OpenCV-2.2.0.tar.bz2

  应用 iOS SDK补丁:

  cd OpenCV-2.2.0

  patch -p1 < ../OpenCV-2.2.0.patch

  接下来为模拟器生成OpenCV静态库。所有的文件放在opencv_simulator目录。运行make命令时,最好在-j选项后面加上你的CPU内核数,这样可以节约一些时间。

  cd .. # Back to the top of demo project directory.

  mkdir build_simulator

  cd build_simulator

  ../opencv_cmake.sh Simulator ../OpenCV-2.2.0

  make -j 4

  make install

  然后为物理设备生成OpenCV静态库,并放在opencv_device目录下:

  cd .. # Back to the top of demo project directory.

  mkdir build_device

  cd build_device

  ../opencv_cmake.sh Device ../OpenCV-2.2.0

  make -j 4

  make install

  脚本

  opencv_cmake.sh 脚本带有一些参数。使用--help参数可以查看各种参数的用法。UIImage 和 IplImage 类型转换

  OpenCV使用IplImage结构,对应于iOS SDK的UIImage对象。这意味着,我们需要在二者间进行转换。幸运的是,我们通过用SDK提供的API来做。

  UIImage à IplImage

  // NOTE you SHOULD cvReleaseImage() for the return value when end ofthe code.

  - (IplImage *)CreateIplImageFromUIImageUIImage *)image {

  // Getting CGImage from UIImage

  CGImageRefimageRef = image.CGImage;

  CGColorSpaceRefcolorSpace = CGColorSpaceCreateDeviceRGB();

  // Creatingtemporal IplImage for drawing

  IplImage *iplimage= cvCreateImage(cvSize(image.size.width,image.size.height), IPL_DEPTH_8U,4   );

  // CreatingCGContext for temporal IplImage

  CGContextRefcontextRef = CGBitmapContextCreate(iplimage->imageData, iplimage->width,iplimage->height, iplimage->depth, iplimage->widthStep, colorSpace,kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);

  // Drawing CGImageto CGContext

  CGContextDrawImage(contextRef, CGRectMake(0, 0, image.size.width,image.size.height), imageRef);

  CGContextRelease(contextRef);

  CGColorSpaceRelease(colorSpace);

  // Creating resultIplImage

  IplImage *ret =cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);

  cvCvtColor(iplimage, ret, CV_RGBA2BGR);

  cvReleaseImage(&iplimage);

  return ret;

  }

  用完IplImage之后,FAQ记住用cvReleseImage来释放它http://www.appsipa.com/ 。

  IplImage àUIImage

  // NOTE You should convert color mode as RGB before passing to thisfunction

  - (UIImage *)UIImageFromIplImageIplImage *)image {

  CGColorSpaceRefcolorSpace = CGColorSpaceCreateDeviceRGB();

  // Allocating thebuffer for CGImage

  NSData *data =[NSData dataWithBytes:image->imageData length:image->imageSize];

  CGDataProviderRefprovider =    CGDataProviderCreateWithCFData((CFDataRef)data);

  // CreatingCGImage from chunk of IplImage

  CGImageRefimageRef = CGImageCreate(image->width, image->height,     image->depth,image->depth * image->nChannels, image->widthStep,     colorSpace,kCGImageAlphaNone|kCGBitmapByteOrderDefault, provider, NULL, false,kCGRenderingIntentDefault);

  // Getting UIImagefrom CGImage

  UIImage *ret = [UIImageimageWithCGImage:imageRef];

  CGImageRelease(imageRef);

  CGDataProviderRelease(provider);

  CGColorSpaceRelease(colorSpace);

  return ret;

  }

  Ok,现在你可以在你的iPhone项目中使用OpenCV了。

  在你的项目中使用OpenCV库

  示例程序已经为OpenCV库的使用配置过了。如果你想在自己的项目中使用OpenCV,你需要在项目中加入以下配置。在demo程序中,你可以通过Xcode查看这些设置。

  把OpenCV库目录中的libopencv_core.a加到项目中(用于模拟器或用于设备)。实际上,在这里Xcode并不关心是用于模拟器还是设备,因为它是通过库搜索路径来决定的。

  加入Accelerate.framework框架。

  选择有效的target,打开 build settings页。

  把-lstdc++ 和 –lz加到Other Linker Flags中

  把OpenCV的include目录添加到Header Search Paths(设备和模拟器)

  把OpenCV的lib目录添加到Library Search Paths(设备和模拟器)

本文转载自:http://www.qrsdev.com/forum.php?mod=viewthread&tid=1147

上一篇: 图像特效
下一篇: UITextField
abcMx
粉丝 15
博文 184
码字总数 63849
作品 0
无锡
程序员
私信 提问
Porting OpenCV 2.3.1 to iPhone 3GS/4/4S

Porting OpenCV 2.3.1 to iPhone 3GS/4/4S - 如何使用cmake+Xcode編譯OpenCV 2.3.1函式庫給iOS使用 要能在Xcode中使用OpenCV 2.3.1函式庫來實作自己的程式首要之務當然是要能建立出符合iOS使...

晨曦之光
2012/05/28
609
0
千呼万唤始出来!OpenCV 4.0正式发布!

作者 | 周强(本文为作者独立观点,转载请联系作者) 来源 | 我爱计算机视觉 OpenCV 4.0 正式版来啦! 重回英特尔的 OpenCV 终于迎来一次大版本更新,增加了诸多新特性,快来一起看看吧~ 因...

AI科技大本营
2018/11/22
0
0
(转)在Mac下使用OpenCV, 在Xcode下使用OpenCV (非常基础,详细)

系统环境:ML10.8.2 XCode版本:4.5.2 OpenCV版本:2.4.3 Eclipse版本:Juno Service Release 1 在这里特别提醒大家: opencv中文官方网站介绍的“opencv在Mac OS系统下的安装方法”已经严重...

代码学习者01
2014/02/20
248
0
OpenCV学习笔记(09):opencv3.2+cmake3.8+VS2013,编译opencv_contrib

版权声明:假装这里有个版权声明…… https://blog.csdn.net/CV_Jason/article/details/70037545 Cmake编译opencv contrib部分 1. 前言 最近才知道,在OpenCV3.0 之后,OpenCV算法包被拆分成...

CodeLike
2017/04/10
0
0
OpenCV配置,从来没有这么简单!

用CMAKE配置自己的OpenCV程序 ---配置OpenCV从来没有这么简单! 本文需要一定的CMAKE知识,推荐阅读中文的 CMake Practice.pdf ,至于Cmake是什么,我只能说他是跨平台的项目管理工具,具体请各位...

LMcallme
2015/04/26
1K
6

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins admin 密码忘记解决

一、admin密码未更改情况 1.进入\Jenkins\secrets目录,打开initialAdminPassword文件,复制密码; find / -name initialAdminPassword [root@jenkins jenkins]# cat /var/lib/jenkins/secre......

SuShine
31分钟前
5
0
LiveData原理分析

LiveData原理分析 1 LiveData简介 大部分Android应用会从网络或SQLite数据库存取数据,并根据数据更新界面。为了避免ANR,主线程中不能存取数据。而后台线程中无法更新界面。通常的做法是让后...

tommwq
45分钟前
4
0
Java描述设计模式(20):命令模式

本文源码:GitHub·点这里 || GitEE·点这里 一、生活场景 1、场景描述 智能电脑的品牌越来越多,由此诞生了一款电脑控制的APP,万能遥控器,用户在使用遥控器的时候,可以切换为自家电视的品...

知了一笑
46分钟前
3
0
java---网络编程(上)

1.1网络编程 网络编程指的是编写运行在多个设备计算机的程序,这些计算机通过网络连接起来 java.net包中提供了两种常见的网络协议的支持: TCP:TCP是传输控制层协议的缩写,它保障了两个应用...

Firefly-
50分钟前
15
0
城市搜索插件 city-query

  今天,给大家介绍一个比较简单有用的插件city-query,大家可以从coding上面下载下来。 git clone https://gitee.com/jflsy/city-query.git   引用插件时只需要src文件下的内容就可以了...

芳缘
55分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部