在工作中遇到把基于opencv的代码移植到板子上运行,在网上查看了很多资料,尝试了两种方案,都是可行的
1.把opencv代码用ndk的方式编译成可执行文件,直接放到板子上运行,这种方式是最便捷的不用考虑板子上其他程序的干扰
附上ndk编译代码,准备好下面两个文件后,就可以编译出一个native的可执行文件,直接放到机器上运行,就可以得到opencv计算的结果了
android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
OPENCV_INSTALL_MODULES:=on
OPENCV_CAMERA_MODULES:=off
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
#try to load OpenCV.mk from default install location
include /home/zoone/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
LOCAL_MODULE := native
LOCAL_SRC_FILES := native.cpp
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_EXECUTABLE)
application.mk
APP_STL:=gnustl_static
APP_CPPFLAGS:=-frtti -fexceptions
APP_ABI:=armeabi armeabi-v7a
APP_PLATFORM := android-19
2.把opencv的源码交叉编译arm的so库文件
编译arm平台的so库时,最好基于cmake来配置,因为opencv下载下来的源码自带了各个模块的cmake文件,直接配置cmake来编译非常方便
配置编译环境按照下面的三张图顺序进行就可以了
选择opencv源代码根目录
选择编译平台
选择编译工具,分别是gcc 和 g++ Operation system任意写一个好识别的名字,如arm-linux ,因为系统识别不到,后面会报system的错误,这个错误忽略不管
按上面的配置完成之后,点击Configue,为了方便找到编译出来opencv的so库的位置,对CMAKE_INSTALL_PREFIX 设置一下,指向到你想存放so库 的路径
完成上诉后,点击Generate,配置编译文件,编译过程中会报很多错误,包括pthread,ltr,ldl等 ,发现报这些错误后
很简单,找到你定义的编译路径build下面的CMakeCache.txt,修改CMAKE_EXE_LINKER_FLAGS:STRING = -lpthread -lrt ldl
修改了上面配置后,重新点击Generate,OK,静静等待编译通过就可以了
在反复尝试上面两种方式运行opencv代码时,还尝试过编译静态库,编译静态很简单,只要把camke配置上shared_lib勾去掉就可以,但静态库编译出来很麻烦,需要链接其他对应的20多个其他库,解决起来很头疼,所以建议不用静态库,用动态库