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