在iPhone上使用OpenCV

注意:虽然本方法可行,但是在opencv2中少了一些library。如果使用缺少的库还需手动添加。使用繁琐。现有更简单的在iOS上运行OpenCV的方法。

链接地址:http://blog.sina.com.cn/s/blog_698415f20100y7ip.html

OpenCV的全称是:Open Source Computer Vision Library

OpenCV1999年由Intel建立,现在由Willow Garage提供支持。OpenCV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,可以运行在LinuxWindowsMac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了PythonRubyMATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。最新版本是2.4.0。(此段文字摘自百度百科

 

OpenCVIntel公司开发的计算机视觉库,例如,使用这个库,我们可以很容易的检测面部。我纪录了如何在IOS SDK上使用它,包括创建脚本和演示程序。上边是演示程序的截图。

支持最新的OpenCVIOS SDK

更新项目, 支持OpenCV 2.2.0, iOS SDK 4.3, Xcode 4 (更新于 04/17/2011.)

入门

所有的代码和资料都是开源的,你可以从我的github资源库获得。它包括预编译OpenCV的库和头文件,使您可以轻松地启动测试它。如果你已经有了Git命令,仅仅从我的github克隆资源就可以。如果没有,只好从github下载ziptar包并释放它。

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

 

获取到源代码,用Xcode打开OpenCVTest.xcodeproj,然后建立它。你会得到一个演示程序在iPhone虚拟机或iPhone设备上。

从源代码建立OpenCV的资源库

 

你也可以从源代码OpenCV库使用gcc交叉环境编译。我加了一些支持的脚本使你可以很容易这样做。重要的一点是,像“.framework”的IOS SDK不支持动态链接。我们必须使静态链接库和静态链接配置到你的应用程序中。

  1.  使用CMake命令建立OpenCV. 使用 Homebrew  MacPorts你可以轻松的安装它。

    # 使用Homebrew
    % brew install cmake
    # 使用MacPorts
    % sudo port install cmake
    
    

    如果你已经安装了最新的java更新,你可能会被要求安装javadeveloper_10.6_10m3261.dmg。这很奇怪,但cmake要求从最新的Java更新中删除jni.h,你可以从这里下载 Mac OS X 10.6,这可能需要你订阅苹果开发者(开发者权限)。是的,苹果现在要贬低在MacOS X 上的Java(更新于 10/30/2010)。 

  2. sourceforge获取源代码。我测试了OpenCV-2.2.0.tar.bz2

  3. 在演示项目顶级目录提取下载的归档文件。

    % tar xjvf OpenCV-2.2.0.tar.bz2
    
    
  4.  应用为iOS SDK的补丁。

    % cd OpenCV-2.2.0
    % patch -p1 < ../OpenCV-2.2.0.patch
    
    
  5. 接下来的步骤是建立OpenCV的静态库。所有的文件被装到opencv_simulator目录。运行make命令时,你更好的分配j选项和数量根据你CPU的内核数。没有j选项,它需要较长的时间。

    % cd .. # 返回到演示程序的project目录
    % mkdir build_simulator
    % cd build_simulator
    % ../opencv_cmake.sh Simulator ../OpenCV-2.2.0
    % make -j 4
    % makeinstall
    
    
    译者测试:
    如果你的Mac OS系统版本过高,在运行"opencv_cmake.sh"可能会提示如下信息:
    iOS SDK Version 4.3 is not found, please select iOS version you have.
    
    
    不要紧,这时因为新版本的Mac OS中SDKs的目录结构有所更改,执行以下操作即可解决。
    % vim../opencv_cmake.sh
    
    
    修改:
    DEVELOPER_ROOT="/Developer/Platforms/${TARGET_SDK_NAME}.platform/Developer"
    
    
    为:
    DEVELOPER_ROOT="/Applications/Xcode.app/Contents/Developer/Platforms/${TARGET_SDK_NAME}.platform/Developer"
    
    
    即可。
  6. 之后的下一个步骤,建立设备的OpenCV静态库的所有文件到build_device目录。

    % cd .. # 返回到演示程序的project目录
    % mkdir build_device
    % cd build_device
    % ../opencv_cmake.sh Device ../OpenCV-2.2.0
    % make -j 4
    % make install
    
    

建立支持脚本

之后的下一个步骤,建立设备的OpenCV静态库的所有文件到build_device目录

图像UIImageIplImage之间的转换

 

OpenCV是使用IpImage的结构加工,使用IOS SDKUIImage对象显示在屏幕上。这意味着我们需要一个介于UIImageIpImage之间的转换器。值得庆幸的是,我们可以利用iOS SDK APIs做到。

UIImage创建IpImage是这样的:

// NOTE 戻り値は利用後cvReleaseImage()で解放してください
- (IplImage *)CreateIplImageFromUIImage:(UIImage *)image {
  // CGImageをUIImageから取得
  CGImageRef imageRef = image.CGImage;

  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  // 一時的なIplImageを作成
  IplImage *iplimage = cvCreateImage(
    cvSize(image.size.width,image.size.height), IPL_DEPTH_8U, 4
  );
  // CGContextを一時的なIplImageから作成
  CGContextRef contextRef = CGBitmapContextCreate(
    iplimage->imageData, iplimage->width, iplimage->height,
    iplimage->depth, iplimage->widthStep,
    colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault
  );
  // CGImageをCGContextに描画
  CGContextDrawImage(
    contextRef,
    CGRectMake(0, 0, image.size.width, image.size.height),
    imageRef
  );
  CGContextRelease(contextRef);
  CGColorSpaceRelease(colorSpace);

  // 最終的なIplImageを作成
  IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);
  cvCvtColor(iplimage, ret, CV_RGBA2BGR);
  cvReleaseImage(&iplimage);

  return ret;
} 

不要忘记使用cvReleaseImage释放IpImage!

IpImage创建UIImage是这样的:

// NOTE IplImageは事前にRGBモードにしておいてください。
- (UIImage *)UIImageFromIplImage:(IplImage *)image {
  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  // CGImageのためのバッファを確保
  NSData *data =
    [NSData dataWithBytes:image->imageData length:image->imageSize];
  CGDataProviderRef provider =
    CGDataProviderCreateWithCFData((CFDataRef)data);
  // IplImageのデータからCGImageを作成
  CGImageRef imageRef = CGImageCreate(
    image->width, image->height,
    image->depth, image->depth * image->nChannels, image->widthStep,
    colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,
    provider, NULL, false, kCGRenderingIntentDefault
  );
  // UIImageをCGImageから取得
  UIImage *ret = [UIImage imageWithCGImage:imageRef];
  CGImageRelease(imageRef);
  CGDataProviderRelease(provider);
  CGColorSpaceRelease(colorSpace);
  return ret;
} 

OK,现在你可以在iPhone上享用OpenCV了。

在自己的项目中使用OpenCV

  • 你可以从我的资源库中下载演示程序,它已经被配置为使用这些库。如果你想在自己的项目中使用OpenCV库,你应该需要增加它的下一个配置。在这个演示程序的Xcode项目中,你可以看到这些设置。

  • OpenCV lib目录为模拟器或设备添加libopencv_core.a。事实上Xcode并不关心是设备或模拟器中的哪一个,因为它是由选定的库去搜索路径。

  • 添加Accelerate.frameworkOpenCV库内部使用。

    Path:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/Accelerate.framework

 
  •  选择你的工程文件(图 1),选中TARGETS下与工程文件同名的target,打开信息面板并选中Build Settings选项卡(图 2)。

    (图 1)
     
    (图 2)
     
    • 添加 -lstdc++  -lz Other Linker Flags(图 2)。
    • OpenCVopen_simulatoropen_device的路径添加到Header Search Paths(图 3-13-23-3)。"$(SRCROOT)/opencv_device/include",参照OpenCVTest项目。
    • 添加OpenCVlib目录到Library Search Paths(图 3-13-23-3)。"$(SRCROOT)/opencv_device/lib",参照OpenCVTest项目。
 
(图 3-1)
 

 

(图 3-2)
 
(图 3-3)
 
    • 仔细对照你的工程配置是否与演示程序的工程配置相同。如果你的工程配置与演示程序的配置或图3-3相同,那么恭喜你,你的工程环境已经搭建好了。
posted @ 2013-05-10 13:54  xiaze  阅读(569)  评论(0编辑  收藏  举报