为IOS生成OpenCV

    申明:本博文内容来自于互联网,如因本文内容而发生的一切纠纷,均与本文章的翻译者无关。翻译质量因本人水平,有所限制。欢迎批评指正。本文章仅供参考、学习、交流之用,禁止用于任何商业用途。转载时请保留原文出处与保留本申明,多谢合作

        原文出处:http://computer-vision-talks.com/2010/12/building-opencv-for-ios/      OpenCV是编译实时电脑图片的函数库,它集成了大量的算法。OpenCV支持windows和Linux系统(另外还有Android的2.2以上系统)。但是,很不幸,目前,官方并不支持IOS系统。在这篇文章里,我会向你展示,如何生成一个可以用于这个系统的并可运行于iPhone 或iPad上的OpenCV库。

准备

 现在我要需要:

        XCode (开发者工具,它可以在设备上做调试)

  • CMake
  • Fresh OpenCV
  • SVN 工具

只要从公共的svn库check out一下,你就可以轻而易举地下载到最新的OpenCV

mkdir opencv-library
cd opencv
svn co https://code.ros.org/svn/opencv/trunk/opencv

我建议使用真实的版本,而不是官方网站发布的版本,实际上,WillowGarage的一些工作者每周都会向服务器提交一些 Bug的修改。

生成:

    现在,当我们拷贝OpenCV的源码后,我们需要一个普通的Xcode工程去生成它。运行CMake (我更喜欢使用CMake GUI,当然使用命令行工具也是没问题的)。选择正确的源码目录和一个专用目录用于存放普通工作目录然后点击“Generate”按键,在对话框中选择Xcode的工作目录。

现在你的CMake窗口就如下所示:

cmake-opencv2.jpg

这里我们要修改几个标志:

  • BUILD_SHARED_LIBS = NO
  • BUILD_NEW_PYTHON_SUPPORT = NO
  • BUILD_EXAMPLES = NO
  • ENABLE_SSE.. = NO (All of them)
  • WITH_EIGEN2 = NO
  • WITH_PVAPI = NO
  • WITH_OPENEXR = NO
  • WITH_QT = NO
  • WITH_QUICKTIME = NO

另外一个重点是,定义库的头文件将要存放的目录:

CMAKE_INSTALL_PREFIX = <你的路径>

在本文里,我使用以下的目录结构:

  • opencv-library/opencv – Sources from SVN repository
  • opencv-library/build – Build directory
  • opencv-library/install-dir – Install directory

点击"Configure" 然后再点击 "Generate"。现在已经做好了生成OpenCV的准备了。

       找到并打开OpenCV.xcodeproj.这里我也也要使用一些技巧 

opencv-xcode-project1.jpg

1)修改SDK,把acOS SDK 改为 iOS SDK.这一点很重要,因为这会通知X code使用正确的架构(armv6/armv7).

base-sdk1.jpg

2) 禁止所有的项目使用Thumb编译,禁止了Thumb指令集后,浮点计算的速度将会提高两倍

opencv-disable-compile-for-thumb1.jpg

注意: 禁止了"Compile for thumbs" 选项实际上只能应用于IPhone 3G等老型号的

projects-delete.jpg

机型. 如果你的目标机型是iPhone 3GS或者你不会使用这种类型的CPU(arm7 架构),你并不需要禁止 "Compile for Thumbs". 感谢Shervin Emami他给我指出了这个细节

      终于,我们做好了编译的准备了!我们要同时生成一个“debug” 和一个 “release”  配置分别应用于模拟器和设备平台。但是当我们开始生成库的时候,我们将会在highgui项目中得到很多的编译错误提示。 

      发生这些错误是因为,OpenCV使用QTKit来捕捉相机。不幸的是,这个框架在IOS中并不存在。有两种方法来解决这个问题:从项目中删除所有的有错文件(这需要对CMake方法有一定的基础);另一个就简单多了,在你的项目中不使用highgui,但对你来说,你将会失去很多很有用的函数如:cvLoadImage, cvShowImage, cvCreateCaptureFromCam, cvCreateCaptureFromFile 等等。这并不是一个大问题,ios API提供了所有的这些功能。

      这并不是很完美,但问题同样是解决了--简单地从工作目录中删除所有的有应用到highgui库的项目(和highgui本身),做完这些处理后,工程就可以没有错误地通过编译了。 

链接所有项目

Okay, now we have four versions of staticaly linked libraries. 

好了,现在我们有四个版本的静态链接库。我建议使用lipo工具建一个庞大的OpenCV的两进制库。它对于使用一个库支持来同时支持模拟器(i386架构)和设备(armv6/armv7)有非常大的作用.

And I suggest to use lipo tool to create fat-binaries for OpenCV libraries. It's very useful to have one lib file for both Simulator (i386 architecture) and Device (armv6/armv7).

以下是使用bash脚本,来将它们合并起来:

# Create armv7 + i386 OpenCV library

mkdir -p build/lib/universal

lipo -create build/lib/Release-iphoneos/libopencv_calib3d.a build/lib/Release-iphonesimulator/libopencv_calib3d.a -output build/lib/universal/libopencv_calib3d.a
lipo -create build/lib/Release-iphoneos/libopencv_contrib.a build/lib/Release-iphonesimulator/libopencv_contrib.a -output build/lib/universal/libopencv_contrib.a
lipo -create build/lib/Release-iphoneos/libopencv_core.a build/lib/Release-iphonesimulator/libopencv_core.a -output build/lib/universal/libopencv_core.a
lipo -create build/lib/Release-iphoneos/libopencv_features2d.a build/lib/Release-iphonesimulator/libopencv_features2d.a -output build/lib/universal/libopencv_features2d.a
lipo -create build/lib/Release-iphoneos/libopencv_gpu.a build/lib/Release-iphonesimulator/libopencv_gpu.a -output build/lib/universal/libopencv_gpu.a
lipo -create build/lib/Release-iphoneos/libopencv_imgproc.a build/lib/Release-iphonesimulator/libopencv_imgproc.a -output build/lib/universal/libopencv_imgproc.a
lipo -create build/lib/Release-iphoneos/libopencv_legacy.a build/lib/Release-iphonesimulator/libopencv_legacy.a -output build/lib/universal/libopencv_legacy.a
lipo -create build/lib/Release-iphoneos/libopencv_ml.a build/lib/Release-iphonesimulator/libopencv_ml.a -output build/lib/universal/libopencv_ml.a
lipo -create build/lib/Release-iphoneos/libopencv_objdetect.a build/lib/Release-iphonesimulator/libopencv_objdetect.a -output build/lib/universal/libopencv_objdetect.a
lipo -create build/lib/Release-iphoneos/libopencv_video.a build/lib/Release-iphonesimulator/libopencv_video.a -output build/lib/universal/libopencv_video.a
lipo -create build/lib/Release-iphoneos/libopencv_flann.a build/lib/Release-iphonesimulator/libopencv_flann.a -output build/lib/universal/libopencv_flann.a
lipo -create build/3rdparty/lib/Release-iphoneos/libopencv_lapack.a build/3rdparty/lib/Release-iphonesimulator/libopencv_lapack.a -output build/lib/universal/libopencv_lapack.a
lipo -create build/3rdparty/lib/Release-iphoneos/liblibjpeg.a build/3rdparty/lib/Release-iphonesimulator/liblibjpeg.a -output build/lib/universal/liblibjpeg.a
lipo -create build/3rdparty/lib/Release-iphoneos/liblibpng.a build/3rdparty/lib/Release-iphonesimulator/liblibpng.a -output build/lib/universal/liblibpng.a
lipo -create build/3rdparty/lib/Release-iphoneos/libzlib.a build/3rdparty/lib/Release-iphonesimulator/libzlib.a -output build/lib/universal/libzlib.a

lipo -create build/lib/Debug-iphoneos/libopencv_calib3d.a build/lib/Debug-iphonesimulator/libopencv_calib3d.a -output build/lib/universal/libopencv_calib3dd.a
lipo -create build/lib/Debug-iphoneos/libopencv_contrib.a build/lib/Debug-iphonesimulator/libopencv_contrib.a -output build/lib/universal/libopencv_contribd.a
lipo -create build/lib/Debug-iphoneos/libopencv_core.a build/lib/Debug-iphonesimulator/libopencv_core.a -output build/lib/universal/libopencv_cored.a
lipo -create build/lib/Debug-iphoneos/libopencv_features2d.a build/lib/Debug-iphonesimulator/libopencv_features2d.a -output build/lib/universal/libopencv_features2dd.a
lipo -create build/lib/Debug-iphoneos/libopencv_gpu.a build/lib/Debug-iphonesimulator/libopencv_gpu.a -output build/lib/universal/libopencv_gpud.a
lipo -create build/lib/Debug-iphoneos/libopencv_imgproc.a build/lib/Debug-iphonesimulator/libopencv_imgproc.a -output build/lib/universal/libopencv_imgprocd.a
lipo -create build/lib/Debug-iphoneos/libopencv_legacy.a build/lib/Debug-iphonesimulator/libopencv_legacy.a -output build/lib/universal/libopencv_legacyd.a
lipo -create build/lib/Debug-iphoneos/libopencv_ml.a build/lib/Debug-iphonesimulator/libopencv_ml.a -output build/lib/universal/libopencv_mld.a
lipo -create build/lib/Debug-iphoneos/libopencv_objdetect.a build/lib/Debug-iphonesimulator/libopencv_objdetect.a -output build/lib/universal/libopencv_objdetectd.a
lipo -create build/lib/Debug-iphoneos/libopencv_video.a build/lib/Debug-iphonesimulator/libopencv_video.a -output build/lib/universal/libopencv_videod.a
lipo -create build/lib/Debug-iphoneos/libopencv_flann.a build/lib/Debug-iphonesimulator/libopencv_flann.a -output build/lib/universal/libopencv_flannd.a
lipo -create build/3rdparty/lib/Debug-iphoneos/libopencv_lapack.a build/3rdparty/lib/Debug-iphonesimulator/libopencv_lapack.a -output build/lib/universal/libopencv_lapackd.a
lipo -create build/3rdparty/lib/Debug-iphoneos/liblibjpeg.a build/3rdparty/lib/Debug-iphonesimulator/liblibjpeg.a -output build/lib/universal/liblibjpegd.a
lipo -create build/3rdparty/lib/Debug-iphoneos/liblibpng.a build/3rdparty/lib/Debug-iphonesimulator/liblibpng.a -output build/lib/universal/liblibpngd.a
lipo -create build/3rdparty/lib/Debug-iphoneos/libzlib.a build/3rdparty/lib/Debug-iphonesimulator/libzlib.a -output build/lib/universal/libzlibd.a

通用的二进制文件会被存放到build/lib/universal目录下。 “build” 文件是你在进入CMake的第一阶段“generating workspace”时产生的。

要包含头文件,可以通过运行install target in XCode in build/include实现

应用

我的方法并没有打算建立一个私有的框架,你可以可以自主地通过手工添加的方式,来包含它并在你的项目中直接的链接它。如果你有建立私用框架的经验,请给我发一个email,我将会把它加入到我的文章中

分享

这是一个预编译的OpenCV库的版本. 我使用的版本是 №4771.
Download Precompiled OpenCV library (2547)

同时,我也发布我的自动生成脚本,只要点击一下,它就可以自动生成一个OpenCV for iPhone
Download OpenCV Build Script (4349)

参考

1.Break That Thumb For Best iPhone Performance

转载于:https://www.cnblogs.com/zeping/archive/2011/10/15/2213444.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值