注:内容略有修改,其操作经多人测试OK。希望能够帮助到你。
在iPhone上使用OpenCV
Posted by Yoshimasa Niwa on 03/14, 2009 译者:王彪
OpenCV的全称是:Open Source Computer Vision Library。
OpenCV于1999年由Intel建立,现在由Willow Garage提供支持。OpenCV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。最新版本是2.4.0。(此段文字摘自百度百科)
OpenCV是Intel公司开发的计算机视觉库,例如,使用这个库,我们可以很容易的检测面部。我纪录了如何在IOS SDK上使用它,包括创建脚本和演示程序。上边是演示程序的截图。
支持最新的OpenCV和IOS SDK
更新项目, 支持OpenCV 2.2.0, iOS SDK 4.3, Xcode 4 (更新于 04/17/2011.)
入门
所有的代码和资料都是开源的,你可以从我的github资源库获得。它包括预编译OpenCV的库和头文件,使您可以轻松地启动测试它。如果你已经有了Git命令,仅仅从我的github克隆资源就可以。如果没有,只好从github下载zip或tar包并释放它。
% git git://github.com/niw/iphone_opencv_test.git
获取到源代码,用Xcode打开OpenCVTest.xcodeproj,然后建立它。你会得到一个演示程序在iPhone虚拟机或iPhone设备上。
从源代码建立OpenCV的资源库
你也可以从源代码OpenCV库使用gcc交叉环境编译。我加了一些支持的脚本使你可以很容易这样做。重要的一点是,像“.framework”的IOS SDK不支持动态链接。我们必须使静态链接库和静态链接配置到你的应用程序中。
-
使用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)。
-
从sourceforge获取源代码。我测试了OpenCV-2.2.0.tar.bz2。
-
在演示项目顶级目录提取下载的归档文件。
% 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的内核数。没有j选项,它需要较长的时间。
% cd .. # 返回到演示程序的project目录 % mkdir build_simulator % cd build_simulator % ../opencv_cmake.sh Simulator ../OpenCV-2.2.0 % make -j 4 % make install
译者测试:
如果你的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"
即可。
-
之后的下一个步骤,建立设备的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目录
图像UIImage和IplImage之间的转换
OpenCV是使用IpImage的结构加工,使用IOS SDK的UIImage对象显示在屏幕上。这意味着我们需要一个介于UIImage和IpImage之间的转换器。值得庆幸的是,我们可以利用iOS SDK APIs做到。
从UIImage创建IpImage是这样的:
// NOTE 戻り値は利用後cvReleaseImage()で解放してください
- (IplImage *)CreateIplImageFromUIImag e:(UIImage *)image {
// CGImageをUIImageから取得
CGImageRef imageRef = image.CGImage;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDevice RGB();
// 一時的な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, kCGImageAlphaPremultipli edLast|kCGBitmapByteOrderDefaul t
);
// 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 = CGColorSpaceCreateDevice RGB();
// CGImageのためのバッファを確保
NSData *data =
[NSData dataWithBytes:image->imageData length:image->imageSize];
CGDataProviderRef provider =
CGDataProviderCreateWith CFData((CFDataRef)data);
// IplImageのデータからCGImageを作成
CGImageRef imageRef = CGImageCreate(
image->width, image->height,
image->depth, image->depth * image->nChannels, image->widthStep,
colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefaul t,
provider, NULL, false, kCGRenderingIntentDefaul t
);
// 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.framework被OpenCV库内部使用。
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)。 - 把OpenCV中open_simulator和open_device的路径添加到Header Search Paths(图
3-1,3-2,3-3)。"$(SRCROOT)/opencv_device/include",参照OpenCVTest项目。 - 添加OpenCV的lib目录到Library Search Paths(图
3-1,3-2,3-3)。"$(SRCROOT)/opencv_device/lib",参照OpenCVTest项目。
- 添加
- 仔细对照你的工程配置是否与演示程序的工程配置相同。如果你的工程配置与演示程序的配置或图3-3相同,那么恭喜你,你的工程环境已经搭建好了。