建立OpenCV 框架

原帖:
http://blog.sina.com.cn/s/blog_698415f20100y7ip.html

介绍

这片文章是在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

http://www.open.collab.net/downloads/community/

CMake for Mac

http://www.cmake.org/cmake/resources/software.html

获取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

参考资料:

http://fossies.org/dox/OpenCV-2.3.1a/kinect__maps_8cpp.html

以下是OpenCV相关资源:

1.Using OpenCV on iOS

http://server.everfine.com.tw/blog/archives/2011/04/using-opencv-on.html

2.Building OpenCV for iPhone in one click

http://computer-vision-talks.com/2011/02/building-opencv-for-iphone-in-one-click/

3.OpenCV-iOS

https://github.com/macmade/OpenCV-iOS

4. OpenCV ios (三个Demo教程)

http://docs.opencv.org/doc/tutorials/ios/table_of_content_ios/table_of_content_ios.html

    原文作者:nogodoss
    原文地址: https://blog.csdn.net/nogodoss/article/details/11926063
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞