OpenCV应用

编译安装OpenCV库

作者: yym439 时间: 2020-03-20

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方式接入

  1. 下载Android SDK源码
  2. 拷贝源码sdk\native\libs库到jniLibs文件夹
  3. 拷贝源码sdk\java\src源码到工程,build.gradle添加:
    sourceSets {
     main {
         aidl.srcDirs = ['src/main/java']
     }
    }
    
  4. 注意:
    • 拷贝的sdk源码,操作摄像头的类可能找不到资源,删除报错文件
    • 最新的opencv4依赖 libmediandk.so,有些设备找不到这个库,需要降低opencv版本到3.4.9

5.2 NDK方式接入

  1. 操作《5.1 java sdk方式接入》的步骤
  2. 创建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 )
    
  3. 拷贝源码sdk\native\jni\include头文件,到cpp文件夹
  4. 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: 成功");
  }
}