编译OpenCV for Android

前言:

现在机器视觉越来越多的在移动设备上应用,所以,经常有人需要编译可以运行在android平台上的可以运行的OpenCV。
其实,编译OpenCV并不难,毕竟编译的脚本都写好了,运行一下就Ok了。不过,还是经常会遇见这样那样的问题。例如ffmpeg的版本不匹配就是一个最常见的问题。如果,在编译OpenCV的时候,有关于ffmpeg的报错,请留言,改日我单独写个博客说明,本篇博文主要解决编译OpenCV在android上运行。并写个小demo验证。

准备

OpenCV源码地址:http://opencv.org/releases.html。挑一个你想要的。建议使用2.4.*版本的,因为好多第三方的sdk还没有完全兼容3.2.*。
本文以版本2.4.12为例。

cd $OpenCVPath    
ls

其中,OpenCVPath为OpenCV源码的根目录。
运行上述命令后你会看到如下的内容:

3rdparty    LICENSE     apps        cmake       doc     index.rst   platforms CMakeLists.txt    README.md   build       data        include     modules     samples

最关键的文件就是platforms,通过名字也能看出来,这个就是平台相关的。进去看看里面有什么吧。
这里写图片描述
可以看到platforms下面有android,ios什么的,基本可以确定,这个就是和平台相关的了。继续看看android里面有什么,发现里面有个android.toolchain.cmake,这个就是编译android的工具链。

编译

开始编译前,我们首先在OpenCV的根目录下创建一个存放我们编译结果的文件,我这里用build。

mkdir build 
cd build

然后运行:

cmake \
-DCMAKE_TOOLCHAIN_FILE=\
../platforms/android/android.toolchain.cmake \
-DANDROID_NDK=/path/to/ndk/ \
-DCMAKE_BUILD_TYPE=Release  \
-DANDROID_ABI=armeabi \
-DANDROID_NATIVE_API_LEVEL=21  ..

make -j4

CMAKE_TOOLCHAIN_FILE就是我们刚才查找到的工具链。
ANDROID_NDK指向的是ndk所在的位置,如果不知道在哪里,就运行which ndk-build,把ndk-build所在的文件夹赋值给ANDROID_NDK就行了。
CMAKE_BUILD_TYPE有两个值(Release,Debug,不解释)。
ANDROID_ABI可以指定armeabi或者armeabi-v7a等,这个看你应用需要了,如果要启用NEON,或者vpf之类的,就要使用armeabi-v7a。
这里写图片描述
ANDROID_NATIVE_API_LEVEL这个就是android的api版本号了。
最后,运行make就开始编译了。当编译完后,看一下生成的目录lib里面,就会多一个文件夹armeabi。如果,-DANDROID_ABI=armeabi-v7a,那么在lib里面的就应该是armeabi-v7a。这两个是独立的,互不干扰的,你可以多次编译,生成不同abi。
至此,OpenCV已经编译完了,接下来看看编译好的东西怎么用。

实战

先贴一个demo.cpp:

#include <stdio.h> 
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main() {
    Mat mat(100, 100, CV_8UC3);
    mat.setTo(255);
    printf("hello world! \n");
    imwrite("/sdcard/helloworld.jpg", mat);
    return 1;
}

在编译一个CMakeList.txt:

CMake_minimum_required(VERSION 2.8)
message("begin to =======")
PROJECT("projectFun")
find_package(OpenCV REQUIRED)
if( ANDROID )
    set(LIBRARY_DEPS \${OpenCV_LIBS} log dl)
endif()
set(srcs "/path/to/demo.cpp" )
add_executable(\${PROJECT_NAME} ${srcs})
target_link_libraries(\${PROJECT_NAME} \${LIBRARY_DEPS})

如果demo.cpp和CMakeList.txt所在目录为:$DEMOPATH,运行如下命令:

cd $DEMOPATH
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=$OpenCVPath/platforms/android/android.toolchain.cmake  \
-DANDROID_NDK=/Users/shiming/tools/android-ndk-r11b/ \
-DANDROID_ABI="armeabi" -DANDROID_NATIVE_API_LEVEL=21   \
-DOpenCV_DIR=$OpenCVPath/build/  ..

其中OpenCVPath为OpenCV源码根目录。
运行

ls ../bin/
projectFun

就可以看到我们生成的可执行程序projectFun。然后,把这个可执行程序push到android设备里面,就可以运行了。最后,在/sdcard/下面会发现helloworld.jpg。

至此,OpenCV的编译和运行已经全部完成。

劳动可贵,欢迎转载,请注明出处~
http://blog.csdn.net/minger1202/article/details/71429708

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值