1. 编译工具安装
1.1 安装cmake与cmake gui
- 官网直接下载已经编译过的二进制cmake版本(注意支持的架构平台):
1.解压: tar -zxvf cmake-3.17.0-rc3-Linux-x86_64\ \(1\).tar.gz
2.添加全局环境变量(添加完打开新的终端才会生效):
sudo vim /home/yym/.bashrc
export PATH=$PATH:/home/yym/cmake-3.17.0-rc3-Linux-x86_64/bin
3. 打开cmake界面
cmake-gui
- 官网下载cmake源码进行编译:
1. 解压: tar -xzf cmake-3.17.0-rc3.tar.gz
2. 进入解压的目录,执行: ./bootstrap
3. make install
4. cmake --version
2. Linux下OpenCV源码编译
进入官网,选择Release->Source 下载
2.1 cmake静态编译OpenCV
1. 解压Opencv ,在解压的目录下新建Release文件夹,进入文件夹中
2.右键终端打开:cmake-gui选择源码路径为Opencv解压出的文件夹,build路径为创建好的Release,勾上Advanced选项,点击configure.
3.点击configure之后,会跳出CmakeSetup窗口,选择Unix MakeFiles + Use default native compliers
注意:编译静态库需要把BUILD_SHARED_LIBS选项勾去除;CMKAE_C_FLAGS添加-fPIC
4.configure一次之后,窗口中会出现cmake选项,
选择我们需要的模块(png、jpeg、zlib),动态库调用opencv静态库之后(动态库即包含了opencv的库功能)
6.生成完毕后再点击Generate,提示:Generating Done之后即可关闭cmake-gui
7.进入Release目录内,右键打开终端,输入指令make回车,即开始编译,
8.第三方库位置: /home/yym/opencv-3.4.9/release/3rdparty/lib
opencv库位置: /home/yym/opencv-3.4.9/release/lib
头文件位置: /home/yym/opencv-3.4.9/include
9.编译通过后,建议使用sudo make install直接安装,也可以直接获取静态库文件和头文件进行调用
2.2 linux编写动态库调用opencv静态库
2.2.1 编写CMakeLists.txt
# cmake needs this line 要求的最低版本
cmake_minimum_required(VERSION 2.8)
# Define project name 定义工程名
project(example_project)
#链接的库文件目录(工程目录)
link_directories(${CMAKE_CURRENT_SOURCE_DIR})
# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI 自动查找库
find_package(OpenCV REQUIRED)
# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
# Declare the executable target built from your sources 声明可执行目标文件及源文件
#add_executable(read read.cpp) # 目标文件,源文件0,源文件1,...
ADD_LIBRARY (startprint SHARED img_proc.cpp StartUsbPrint.c StartZPLPrintApi.c)
#ADD_LIBRARY (img_proc STATIC img_proc.cpp)
# Link your application with OpenCV libraries 将目标文件与库链接
target_link_libraries(startprint ${OpenCV_LIBS} libusb-1.0.so) # 目标文件,库路径
2.2.2 编译动态库链接opencv静态库
执行:
cmake .
make
注意:OpenCV编译需要依赖libstdc++.so库,编译的gcc版本不一致导致stdc++库版本不一致,程序不能运行,解决方案:
-
拷贝相应版本的libstdc++.so.6.0.21 到对应系统路径 执行ldconfig;linux更新libstdc++.so.6方法
-
把编译的gcc5的libstdc++.a静态连接到自己的动态库(建议这样做,缺点:动态库变大)
3. OpenCV库模块说明
core模块: 定义了Opencv最为基础的数据结构,必须要有。
imgproc: 图片的处理
imgcodecs: 用于图片的读写(处理图像文件的读取和写入)
calib3d:3D重建
video:视频分析
highgui:用于处理所有高级用户界面操作(显示图片)
features2d:特征检测提取
objdetect:对象检测(检测给定图像中对象的位置)
ml:机器学习(实现目标识别、图像分类、面部检
测、视觉搜索)
photo:计算摄影(应用领域包括高动态范围成像,全景图像、图像补光和光场相
机等)
stitching: 提供创建全景图像的算法
shape:形状分析(提取不同形状、测量它们之间的相似性、转换对象形状)
dnn:深度学习
4. Windows下OpenCV源码编译
1.下载源码,源码路径新建build文件夹
2.下载安装cmake
3.打开配置cmake-gui
4.勾选Build_opencv_world,生成vs工程
5.编译
5. OpenCV for Android
5.1 java sdk方式接入
- 下载Android SDK源码
- 拷贝源码sdk\native\libs库到jniLibs文件夹
- 拷贝源码sdk\java\src源码到工程,build.gradle添加:
sourceSets { main { aidl.srcDirs = ['src/main/java'] } } - 注意:
- 拷贝的sdk源码,操作摄像头的类可能找不到资源,删除报错文件
- 最新的opencv4依赖 libmediandk.so,有些设备找不到这个库,需要降低opencv版本到3.4.9
5.2 NDK方式接入
- 操作《5.1 java sdk方式接入》的步骤
-
创建main/cpp文件夹,新增CMakeLists.txt:
# Sets the minimum version of CMake required to build the native library. cmake_minimum_required(VERSION 3.4.1) # 包含opencv的头文件 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/opencv/jni/include) add_library(libopencv_java3 SHARED IMPORTED ) set_target_properties(libopencv_java3 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libopencv_java3.so) file(GLOB_RECURSE CPP_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) #指定当前目录下的所有.cpp文件(包括子目录) add_library( # Sets the name of the library. my_opencv # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). ${CPP_SRCS} ) # 链接库,注意被依赖的库放后面 target_link_libraries( # Specifies the target library. my_opencv libopencv_java3 # included in the NDK. jnigraphics log ) - 拷贝源码sdk\native\jni\include头文件,到cpp文件夹
- build.gradle添加:
externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" } }
5.3 App加载opencv so库
static {
if (!OpenCVLoader.initDebug()) {
Log.e(TAG, "static initializer: 失败");
bInit = false;
} else {
bInit = true;
//自定义的NDK库
System.loadLibrary("native-lib");
Log.e(TAG, "static initializer: 成功");
}
}