前言:
现在机器视觉越来越多的在移动设备上应用,所以,经常有人需要编译可以运行在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