1. 介绍
2. 示例项目
3. 在自己的项目中使用OpenCV框架
4. 重建OpenCV框架
更新: 2011-11-28 OpenCV框架已经使用opencv的svn修订版7017重建: Check out 第2部分of our series on computer vision.
介绍
这片文章是在iOS上使用电脑的OpenCV视觉库。OpenCV是在BSD许可证下发布的,因此学习和商用都是免费的。它包括今天用在计算机视觉领域的所有标准算法的优化实现,并拥有庞大的用户群体横跨在Linux,Windows,Mac和Android的世界。在过去OpenCV一直难以在iOS上建立。然而最近,OpenCV的团队出色的增加了在iOS的构建并支持视频与捕捉。
在这片文章中,我们的目标是在iOS构建OpenCV框架,我们可以通过简单的拖拽把它添加到自己Xcode的项目中,大大减少了学习曲线。我们还提供了重新构建框架的方法,如果你需要,示例项目包囊括了视频采集和使用iOS OpenCV处理图像的演示。
我们首先讲解了示例项目。其次讲解如何使用OpenCV框架在自己的项目中。最后,我们讲解了如何重新构建OpenCV框架,并解释构建脚本是如何工作的。
一如以往,我们的工作建立在别人的工作之上。我们感谢acknowledge的OpenC团队,Eugene Khvedchenya为OpenCV在iOS上运行所做的前期工作和Diney Bomfim为iOS框架所做的工作。
示例项目
这个示例项目托管在GitHub。你可以从这访问GitHub项目目页面: https://github.com/aptogo/OpenCVForiPhone或者直接下载zip文件: https://github.com/aptogo/OpenCVForiPhone/zipball/master.
该项目包括一个预先构建的OpenCV框架(OpenCV svn revision 7017),一个重建框架的脚本和一个示例程序,演示了使用OpenCV进行视频捕捉和简单的图像处理。
构建和运行应用程序,使用Xcode打开OpenCVClient项目并点击“Run”。注意:iPhone模拟器不支持视频捕获。需要在iOS设备上运行示例程序,在运行过程中会看到视频捕获效果。
应用程序开始运行一些简单的性能测试,cv::Mat与UIImage之间的转换。时序结输出到控制台。性能测试完成后主页面显示结果。点击“捕获”按钮来捕获视频帧。帧处理使用边缘检测算法行使一些OpenCV的图像处理功能,结果显示在屏幕上。使用滑块来调整算法的阈值低,高。处理帧的时间也显示。对于iPhone4typical值是90ms左右,iPhone3则是200ms左右。
在自己的项目中使用OpenCV框架
添加OpenCV框架
添加OpenCV框架最简单的方式是拖拽示例程序的OpenCV框架到自己项目的“Frameworks”中。如果你想拷贝OpenCV框架到你的项目中,请在对话框出现时选中“Copy items into destination group’s folder”。如果你想共享框架在多个项目或有一个共同构建框架的位置,那么你可以不选中它。
另外一种方法,你可以在Xcode中操控“Build Phases”在对象熟悉标签窗口。点击下拉“Link Binary With Libraries”,点击“+”按钮。选择“Add Other…”从出现的对话框中查找到OpenCV.framework文件夹添加.
一旦你已经添加了OpenCV框架,你的项目会自动设置对OpenCV库的链接并可使用OpenCV的头文件。导入OpenCV头文件在你的项目中使用the framework-relative标记#include声明(i.e #include <OpenCV/opencv/.../...>).
添加额外所需的框架
使用OpenCV框架,你必须添加一些额外的苹果提供的框架在你的项目中。在Xcode对象属性窗口操作“Build Phases”。点击下拉“Link Binary With Libraries”,点击“+”按钮。添加如下所示的框架和库。在表格Required勾选列的框架是必须的。在表格第Optional勾选的框架是可选的,如果需要使用OpenCV中的HighGUI模块包括视频拍摄支持。
Framework |
Required |
Optional (required for video capture) |
AVFoundation.framework |
✓ |
|
ImageIO.framework |
✓ |
|
libz.dylib |
✓ |
|
CoreVideo.framework |
|
✓ |
CoreMedia.framework |
|
✓ |
当你添加了所有的所需框架,你项目的“Build Phases”标签的项目属性窗口看起来应该是这样的:
The Build Phases tab in the XCode Project Properties pane
导入OpenCV头文件
OpenCV和OpenCV2 APIs声明的OpenCV头文件是OpenCV框架的一部分。在Xcode的“Project navigator”中找到“Frameworks”分组,找到“OpenCV.framework”点击下拉菜单可以看到头文件。在写OpenCV代码的时候,你需要把相关的头文件导入到你的项目中。最简单的办法是添加头文件预编译模块到(<project name>-Prefix.pch),添加内容如下所示:
///////////////////////////////////////////////////////////////////////////
// Add this new section BEFORE the #import statements for UIKit and Foundation
#ifdef __cplusplus
#import <OpenCV/opencv2/opencv.hpp>
#endif
// Existing #import statements
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#endif
在使用OpenCV框架的源文件里,你还必须更改源文件的扩展名,把“.m”改成“.mm”。这表明编译器的源文件包括混合Objective-C和C代码。请注意,不使用OpenCV的单个源文件可以使用“.m”扩展名。
奇怪的是,OpenCV的头文件必须在UIKit.h和Foundation.h之前导入,因为OpenCV定义了一个最小宏MIN函数与苹果框架冲突。如果你在UIKit.h和Foundation.h之后导入,你会收到编译错误提示 “LLVM”和“GCC 4.2”错误,如:“Statement-expressions are allowed only inside functions”,导入OpenCV头文件时使用“__cplusplus”条件预编译“#import”避免了这个问题。你的项目没有调用OpenCV APIs的文件,你仍然可以使用纯Objective-C的“.m”为扩展名。
使用UIImage扩展
示例项目包括UIImage和cv:Mat互转及其头文件的导入。这2个文件提供了UIImage类(UIImage+OpenCV.h and .mm). 使用扩展,只需要添加2个原文件到你的项目中,并利用以下新的UIImage方法和属性:
@interface UIImage (UIImage_OpenCV)
// Returns an autoreleased UIImage from cv::Mat
+(UIImage *)imageWithCVMat:(const cv::Mat&)cvMat;
// Initialises a UIImage from cv::Mat
-(id)initWithCVMat:(const cv::Mat&)cvMat;
// Returns cv::Mat object from UIImage
@property(nonatomic, readonly) cv::Mat CVMat;
// Returns grayscale cv::Mat object from UIImage
@property(nonatomic, readonly) cv::Mat CVGrayscaleMat;
@end
重建OpenCV框架
包含示例项目自动建设和打包的shell脚步(opencvbuild.sh)。在安装之前,你将需要确保在你的系统中有Subversion和CMake工具。Subversion 需要下载最新的OpenCV源。CMake是OpenCV团队所使用的编译系统。下面是安装文件链接:
Subversion for Mac |
|
CMake for Mac |
获取OpenCV源
首先提取源文件到你想要的目录中。如果你想查看示例项目的布局,这是opencv项目根目录的子目录:
cd <project root>/opencv
下一步,checkout官方资料库的最新源代码。在写这篇文章时,OpenCV并没有发布稳定的版本支持iOS视频捕获。因此,我们用“trunk”中最新版本的源(注意:command结束时的最后日期):
svn co https://code.ros.org/svn/opencv/trunk
执行后你会发现OpenCV在你提取文件的本地目录中:
OpenCVForiOS项目文件夹列表
创建OpenCV
opencvbuild shell 脚本需要2个命令行参数: 在OpenCV源树结构的头位置进行建立。例如示例项目,我们就是在项目的根目录建立的框架。(注意opencvbuild最后阶段的第二个参数):
cd <project root>
./opencvbuild opencv/opencv .
如果建设顺利完成,你会得到有OpenCV的框架,同时在所选的文件假还会有3个库文件包:
OpenCV.framework |
framework for use with iOS device or Simulator |
OpenCV_iPhoneOS |
libraries and headers for use with iOS device |
OpenCV_iPhoneSimulator |
libraries and headers for use with iPhone Simulator |
OpenCV_Universal |
fat libraries and headers for use with iOS device or Simulator |
这些库文件包是中间步骤的组合框架。你可以删除它们,你可能更喜欢使用OpenCV的框架,而不是对个别的库进行链接。
示例程序链接地址:
Git –
https://github.com/aptogo/OpenCVForiPhone
Download zip –
https://github.com/aptogo/OpenCVForiPhone/zipball/master
参考资料: