在本文中,您将会了解到关于在linux下编译android下的opencv,使用cmake的方法的新资讯,同时我们还将为您解释linux编译opencv源码的相关在本文中,我们将带你探索在linux下
在本文中,您将会了解到关于在 linux 下编译 android 下的 opencv,使用 cmake 的方法的新资讯,同时我们还将为您解释linux编译opencv源码的相关在本文中,我们将带你探索在 linux 下编译 android 下的 opencv,使用 cmake 的方法的奥秘,分析linux编译opencv源码的特点,并给出一些关于Android NDK CMake 错误:CMake 无法确定目标的链接器语言、Android OpenCV(零):OpenCV Android SDK、Android Studio - CMake Error: CMake was unable to find a build program corresponding to “Ninja”、Centos7 下编译 ramdisk 内核模块 brd.ko 的方法的实用技巧。
本文目录一览:- 在 linux 下编译 android 下的 opencv,使用 cmake 的方法(linux编译opencv源码)
- Android NDK CMake 错误:CMake 无法确定目标的链接器语言
- Android OpenCV(零):OpenCV Android SDK
- Android Studio - CMake Error: CMake was unable to find a build program corresponding to “Ninja”
- Centos7 下编译 ramdisk 内核模块 brd.ko 的方法
在 linux 下编译 android 下的 opencv,使用 cmake 的方法(linux编译opencv源码)
#前一篇帖子实验了 build_sdk.py 来编译 opencv,失败了。
#本篇尝试使用 cmake 来编译
#感谢这篇帖子提供的指导:https://www.cnblogs.com/jojodru/p/10025658.html
#
cd /home/ahfu
#选择 opencv 3.4.6 版本来编译
wget https://github.com/opencv/opencv/archive/3.4.6.tar.gz
tar -zxvf opencv-3.4.6.tar.gz
wget https://codeload.github.com/opencv/opencv_contrib/tar.gz/3.4.6
tar -zxvf opencv_contrib-3.4.6.tar.gz
#下载 ndk
wget https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip
unzip android-ndk-r14b-linux-x86_64.zip
export PATH=$PATH:/home/ahfu/android-ndk-r14b
# 注意,我一开始使用了 NDK 版本 android-ndk-r19c-linux-x86_64.zip,结果一堆问题
#下载 ANDROID SDK
wget https://dl.google.com/android/repository/tools_r25.2.5-linux.zip
unzip tools_r25.2.5-linux.zip
export PATH=$PATH:/home/ahfu/
# 注意,一开始我下载了 android sdk 版本 android-sdk_r24.4.1-linux.tgz,有问题
#建立编译目录
cd opencv-3.4.6
mkdir build && cd build
#开始 config
cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
-DCMAKE_TOOLCHAIN_FILE="/home/ahfu/opencv-3.4.6/platforms/android/android.toolchain.cmake" \
-DANDROID_NDK="/home/ahfu/android-ndk-r14b" \
-D ANDROID_SDK="/home/ahfu/android_sdk/tools" \
-DANDROID_NATIVE_API_LEVEL=24 \
-DANDROID_ABI="armeabi-v7a" \
-DANDROID_CPP_FEATURES="rtti exceptions" \
-DANDROID_ARM_NEON=TRUE \
-DANDROID_STL=gnustl_static \
-DCMAKE_BUILD_TYPE=Release \
-DOPENCV_EXTRA_MODULES_PATH="/home/ahfu/opencv_contrib-3.4.6/modules" \
-DCMAKE_INSTALL_PREFIX="/home/ahfu/opencv_3.4.6_install/" \
-D BUILD_opencv_java=OFF \
-D BUILD_ANDROID_PROJECTS=OFF \
-D BUILD_ANDROID_EXAMPLES=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_opencv_features2d=OFF \
-D BUILD_FAT_JAVA_LIB=OFF \
-D BUILD_opencv_aruco=OFF \
-D BUILD_opencv_calib3d=OFF \
-D WITH_OPENCL=OFF \
-D WITH_CUDA=OFF \
-D WITH_MATLAB=OFF \
../
#或者指定所有组件的选项
cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
-DCMAKE_TOOLCHAIN_FILE="/home/ahfu/opencv-3.4.6/platforms/android/android.toolchain.cmake" \
-DANDROID_NDK="/home/ahfu/android-ndk-r14b" \
-DANDROID_NATIVE_API_LEVEL=24 \
-DANDROID_ABI="armeabi-v7a" \
-DANDROID_CPP_FEATURES="rtti exceptions" \
-DANDROID_ARM_NEON=TRUE \
-DANDROID_STL=gnustl_static \
-DCMAKE_BUILD_TYPE=Release \
-DOPENCV_EXTRA_MODULES_PATH="/home/ahfu/opencv_contrib-3.4.6/modules" \
-DCMAKE_INSTALL_PREFIX="/home/ahfu/opencv_3.4.6_install/" \
-D BUILD_opencv_java=OFF \
-D BUILD_ANDROID_PROJECTS=OFF \
-D BUILD_ANDROID_EXAMPLES=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_FAT_JAVA_LIB=OFF \
-D BUILD_opencv_apps =ON \
-D BUILD_opencv_aruco =ON \
-D BUILD_opencv_bgsegm =ON \
-D BUILD_opencv_bioinspired =ON \
-D BUILD_opencv_calib3d =OFF \
-D BUILD_opencv_ccalib =ON \
-D BUILD_opencv_core =ON \
-D BUILD_opencv_datasets =ON \
-D BUILD_opencv_dnn =ON \
-D BUILD_opencv_dnn_objdetect =ON \
-D BUILD_opencv_dpm =ON \
-D BUILD_opencv_face =ON \
-D BUILD_opencv_features2d =OFF \
-D BUILD_opencv_flann =ON \
-D BUILD_opencv_fuzzy =ON \
-D BUILD_opencv_hfs =ON \
-D BUILD_opencv_highgui =OFF \
-D BUILD_opencv_img_hash =ON \
-D BUILD_opencv_imgcodecs =ON \
-D BUILD_opencv_imgproc =ON \
-D BUILD_opencv_java_bindings_gen =OFF \
-D BUILD_opencv_js =OFF \
-D BUILD_opencv_line_descriptor =ON \
-D BUILD_opencv_ml =ON \
-D BUILD_opencv_objdetect =ON \
-D BUILD_opencv_optflow =ON \
-D BUILD_opencv_phase_unwrapping =ON \
-D BUILD_opencv_photo =ON \
-D BUILD_opencv_plot =ON \
-D BUILD_opencv_reg =ON \
-D BUILD_opencv_rgbd =ON \
-D BUILD_opencv_saliency =ON \
-D BUILD_opencv_shape =ON \
-D BUILD_opencv_stereo =ON \
-D BUILD_opencv_stitching =ON \
-D BUILD_opencv_structured_light =ON \
-D BUILD_opencv_superres =ON \
-D BUILD_opencv_surface_matching =ON \
-D BUILD_opencv_text =ON \
-D BUILD_opencv_tracking =ON \
-D BUILD_opencv_video =ON \
-D BUILD_opencv_videoio =ON \
-D BUILD_opencv_videostab =ON \
-D BUILD_opencv_world =ON \
-D BUILD_opencv_xfeatures2d =OFF \
-D BUILD_opencv_ximgproc =ON \
-D BUILD_opencv_xobjdetect =ON \
-D BUILD_opencv_xphoto =ON \
-D WITH_ARITH_DEC =ON \
-D WITH_ARITH_ENC =ON \
-D WITH_CAROTENE =ON \
-D WITH_CLP =ON \
-D WITH_CPUFEATURES =ON \
-D WITH_CUDA =OFF \
-D WITH_FFMPEG =ON \
-D WITH_GDCM =ON \
-D WITH_GSTREAMER_0_10 =ON \
-D WITH_HALIDE =ON \
-D WITH_IMGCODEC_HDR =ON \
-D WITH_IMGCODEC_PXM =ON \
-D WITH_IMGCODEC_SUNRASTER =ON \
-D WITH_INF_ENGINE =ON \
-D WITH_ITT =ON \
-D WITH_JASPER =ON \
-D WITH_JPEG =ON \
-D WITH_OPENCL =OFF \
-D WITH_OPENCL_SVM =OFF \
-D WITH_OPENEXR =ON \
-D WITH_OPENMP =ON \
-D WITH_OPENVX =ON \
-D WITH_PNG =ON \
-D WITH_PROTOBUF =ON \
-D WITH_PTHREADS_PF =ON \
-D WITH_QUIRC =ON \
-D WITH_TBB =ON \
-D WITH_TIFF =ON \
-D WITH_WEBP =ON \
../
#执行完成后,如果需要进一步配置更多选项,可以执行
ccmake ..
#开始编译
make -j 40
make install
下面是我的用于测试的程序:
//jpg2bmp.cpp
#include <stdio.h>
#include <inttypes.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#ifndef P
#define P(format, ...) do \
{ \
printf("%s %s %d " format "\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
fflush(stdout); \
} \
while (0);
#endif
int main(int argc, char* argv[]){
if (argc<3){
printf("usage:%s <from> <to>\n", argv[0]);
return 0;
}
cv::Mat image = cv::imread(argv[1], cv::IMREAD_UNCHANGED);
if (image.empty()){
P("load pic %s fail", argv[1]);
return -1;
}
cv::Mat bmp;
cv::cvtColor(image, bmp, cv::COLOR_BGR2GRAY);
cv::imwrite(argv[2], bmp);
P("ok");
return 1;
}
/*
ndk-build NDK_LOG=1 V=1 NDK_DEBUG=1 NDK_PROJECT_PATH=$(pwd) NDK_APPLICATION_MK=./Application.mk APP_BUILD_SCRIPT=./Android.mk
*/
同一目录下用于编译的 Application.mk
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions -std=c++11 -fPIC
#注意:-fPIC一定要加,否则可执行程序在android上执行出现以下错误:
# Android 5.0 and later only support position-independent executables (-fPIE).
APP_PLATFORM := android-24
# 注意:APP_PLATFORM一定要等于或者高于opencv编译时候的版本
# 否则链接的时候出现大量类似错误 undefined reference to ''rand''
APP_ABI := armeabi-v7a
Android.mk 的内容:
include $(CLEAR_VARS)
LOCAL_PATH := ./
LOCAL_C_INCLUDES:=/home/ahfu/opencv_3.4.6_install/sdk/native/jni/include
LOCAL_ARM_NEON := true
LOCAL_CFLAGS:=-g -pie -fPIC -DANDROID_ARM_NEON=TRUE -DANDROID_TOOLCHAIN=clang
LOCAL_LDLIBS += \
-L"/home/ahfu/opencv_3.4.6_install/sdk/native/staticlibs/armeabi-v7a" -lopencv_core -lopencv_imgcodecs -lopencv_imgproc -lm -lz -landroid -llog \
-L"/home/ahfu/opencv_3.4.6_install/sdk/native/3rdparty/libs/armeabi-v7a" -ltegra_hal -lcpufeatures -llibpng -llibjpeg-turbo -llibtiff -llibjasper -llibwebp -lIlmImf \
-lopencv_core -lopencv_imgcodecs -lopencv_imgproc -ltegra_hal \
-L"/home/ahfu/android-ndk-r14b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/" \
-lgnustl_static -ldl
#注意:链接阶段出现了大量stl链接时候的错误
# 不明原因,但是我强制指定了STL的链接目录,问题解决
# 链接目录:android-ndk-r14b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/
# 链接库 -lgnustl_static
LOCAL_MODULE := jpg2bmp
LOCAL_SRC_FILES := jpg2bmp.cpp
LOCAL_LDLIBS += -lm -llog
include $(BUILD_EXECUTABLE)
使用 ndk-build 命令编译:
ndk-build NDK_LOG=1 V=1 NDK_DEBUG=1 NDK_PROJECT_PATH=$(pwd) NDK_APPLICATION_MK=./Application.mk APP_BUILD_SCRIPT=./Android.mk
#下载到 mac 上,然后再传到 android
sz -y libs/armeabi-v7a/jpg2bmp
#以下是 mac 终端
adb push ~/Downloads/jpg2bmp 1.jpg /data/local/tmp
adb shell
cd /data/local/tmp
./jpg2bmp 1.jpg 2.bmp
exit
adb pull /data/local/tmp/2.bmp ./
open 2.bmp
#看到一张 bmp 格式的灰度图,执行成功
Android NDK CMake 错误:CMake 无法确定目标的链接器语言
如何解决Android NDK CMake 错误:CMake 无法确定目标的链接器语言
我正在尝试在 Android Studio 中使用 Android NDK 为 Android 编译比特币(核心),但我得到一个 CMake Error: CMake can not determine linker language for target: bitcoin
。我将 Bitcoin repository 克隆到 app/src/main/cpp/bitcoin
。我的 CMakeLists.txt
(在 app/src/main/cpp/CMakeLists.txt
中)如下:
cmake_minimum_required(VERSION 3.4.1)
project(bitcoin)
add_library(bitcoin SHARED bitcoin/src/)
我尝试了此论坛中的许多解决方案,包括在项目名称后附加 C CXX
和 CXX
、添加 include_directories(bitcoin/src/)
、添加 set_target_properties(bitcoin PROPERTIES LINKER_LANGUAGE CXX)
以及这些的各种组合,但错误仍然存在。我做错了什么?
Android OpenCV(零):OpenCV Android SDK
OpenCV
OpenCV,全称Open Source Computer VisionLibrary,是基于C/C++编写的,是BSD开源许可的计算机视觉开发框架,其开源协议允许在学术研究与商业应用开发中免费使用它。OpenCV支持Windows、Linux、Mac OS、iOS与Android操作系统上的应用开发。
OpenCV Android SDK
OpenCV Android SDK 是OpenCV针对Android平台提供的开发工具包。Android应用开发一般采用Java或者Kotlin语言进行,而OpenCV主要模块采用C、C++语言编制,因此,我们需要通过JNI技术,实现JAVA或者Kotlin调用OpenCV算法模块的目的。
下载
- 官网下载地址(https://opencv.org/releases/)
- 选择OpenCV版本下的Android
SDK概述
SDK目录结构如下:
OpenCV-android-sdk
|_ samples
|_ sdk
| |_ etc
| |_ java
| |_ libcxx_helper
| |_ native
| |_ 3rdparty
| |_ jni
| |_ libs
| |_ arm64-v8a
| |_ armeabi-v7a
| |_ x86
| |_ x86_64
| |_ staticlibs
| |_ arm64-v8a
| |_ armeabi-v7a
| |_ x86
| |_ x86_64
|
|_ LICENSE
|_ README.android
目录 | 文件 |
---|---|
samples | OpenCV运行案例 |
sdk | OpenCV API以及依赖库 |
sdk/etc | Haar和LBP级联分类器 |
sdk/java | OpenCV Java API |
sdk/libcxx_helper | bring libc++_shared.so into packages |
sdk/native | OpenCV 静态库、动态库以及JNI文件 |
英文详细介绍(https://opencv.org/android/)。其实官方的这些介绍并不详细,很多资料随着版本的迭代已过时,意义不大,唯一阅读性高且具有指导意义的应该就是库内的代码与注释了。
开发环境
-
Android Studio 3.5.3 & Android SDK
-
Android NDK 20.1.5948944
-
CMake 3.10.2
-
OpenCV Android SDK 4.2.0
Hello OpenCV Android Sample
- Open Project
- 选择OpenCV-android-sdk目录下的samples目录
- 待编译结束后运行face-detection
Hello OpenCV Android SDK
- New Project
- Import Module…
- 选择OpenCV-android-sdk目录下的sdk目录,修改或者不修改module的名称
- 添加app程序对sdk module的依赖
- 期间可能会遇到一些问题,可能是NDK版本问题,可能是API LEVEL问题,也可能是build tools的问题,对应的稍作处理即可。
示例工程
https://github.com/onlyloveyd/LearningAndroidOpenCV
Android Studio - CMake Error: CMake was unable to find a build program corresponding to “Ninja”
问题描述:
Android Studio - CMake Error: CMake was unable to find a build program corresponding to “Ninja”. CMAKE_MAKE_PROGRAM is not set
解决方式:
Linux 环境下安装 cmake 和 ninja
Centos7 下编译 ramdisk 内核模块 brd.ko 的方法
1. 确保 centos7 上有 gcc 和 make 等工具
2. 获取 centos7 源码。
CentOS-7-x86_64-1503-01 版本的内核是 3.10.0-229.el7.x86_64,下载该 distribution 版本的内核源码,拷贝到根目录:
http://vault.centos.org/7.1.1503/updates/Source/SPackages/kernel-3.10.0-229.1.2.el7.src.rpm
安装该源码包
[user@host]# rpm -i kernel-3.10.0-229.1.2.el7.src.rpm
现在内核的源代码目录树可以在~/rpmbuild/SOURCE/ 这个目录内找得到,源码文件是 linux-3.10.0-229.1.2.el7.tar.xz
3. 编译内核源码
(1) 将 linux-3.10.0-229.1.2.el7.tar.xz 文件拷贝到目录 /usr/src/kernels/ 下
(2) 解压内核源码
[user@host kernels]# tar -xvf linux-3.10.0-229.1.2.el7.tar.xz
(3) 切换到 linux-3.10.0-229.1.2.el7 目录
[user@host kernels] # cd linux-3.10.0-229.1.2.el7
(4) 清除从前编译内核时残留的.o 文件和不必要的关联。
确保源代码目录下没有不正确的.o 文件和文件依赖关系,执行该命令后,内核选项会回到默认的状态下。如果你是下载的内核源码,而且是第一次编译,就没有必要执行这一步操作
[user@host inux-3.10.0-229.1.2.el7]# make mrproper
将已存在的./.config 文件内容,作为新版本内核的默认值。
[user@host inux-3.10.0-229.1.2.el7]# make oldconfig
(5) 配置内核,修改相关参数
[user@host inux-3.10.0-229.1.2.el7]# make menuconfig
在内核配置菜单中配置 ramdisk 块驱动模块的个数和大小,并保存退出
Device Drivers
|-->Block devices
|--> [M]RAM block device support
(xx) Default number of RAM disks
(xx) Default RAM disk size(kbytes)
(6) 编译内核和内核模块
[user@host inux-3.10.0-229.1.2.el7]# make bzImage
[user@host inux-3.10.0-229.1.2.el7]# make modules
(7) 编译后的 Ramdisk 模块的存放位置
/usr/src/kernels/linux-3.10.0-229.1.2.el7/drivers/block/brd.ko
4. 安装新的 brd.ko 模块
(1) 将新的 brd.ko 模块拷贝到 Centos7 系统的 如下目录 /lib/modules/3.10.0-229.el7.x86_64/kernel/drivers/block/,
覆盖原来的 ramDisk 模块 brd.ko。
(2) 将旧的 brd.ko 模块从内核中移除。
[root@localhost ~]# rmmod brd
(3) 更新内核模块依赖。
[root@localhost ~]# depmod -a
(4) 重新挂载内核模块。
[root@localhost ~]# modprobe brd
(5) 检查内核模块是否挂载成功,
如果上面的内核选项中 [Default number of RAM disks] 的值设置的是 2,那么,
新模块加载成功后,命令会输出显示 /dev/ram0 和 /dev/ram1 两个设备
[root@localhost ~]# ls /dev/ram*
(6) 检查 ramdisk 的容量大小 (以 1024M 的 ramdisk 为例),输入以下命令。
[root@localhost ~] mkdir /tmp/ramdisk0
[root@localhost ~] mke2fs /dev/ram0
[root@localhost ~] mount /dev/ram0 /tmp/ramdisk0
[root@localhost ~] df -h
Filesystem Size Used Avail Use% Mounted on
/dev/ram0 1008M 1.3M 956M 1% /tmp/ramdisk0
关于在 linux 下编译 android 下的 opencv,使用 cmake 的方法和linux编译opencv源码的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Android NDK CMake 错误:CMake 无法确定目标的链接器语言、Android OpenCV(零):OpenCV Android SDK、Android Studio - CMake Error: CMake was unable to find a build program corresponding to “Ninja”、Centos7 下编译 ramdisk 内核模块 brd.ko 的方法等相关内容,可以在本站寻找。
本文标签: