在iPhone上使用 OpenCV


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(設備和模擬器)
java

相關文章
相關標籤/搜索