以下[参考]链接,如有侵权,请联系删除,在此先感谢在网络上无私奉献的人们~
如有错误,请联系更正,GitHub同文地址
1.1 下载 OpenCV 3.4.0 源码 opencv-3.4.0.zip
(假定目录为
)
1.2 下载 OpenCV_contrib 3.4.0 源码 opencv_contrib-3.4.0.zip
(假定目录为
)
注意:必须与 opencv 版本一致
1.3 安装 cmake-gui 3.11.1 x64 cmake 的 GUI 工具 cmake-3.11.1-win64-x64.msi
1.4 安装 Visual Studio 2015
1.5 (可选)安装 Qt 5.11.0 qt-opensource-windows-x86-5.11.0.exe
选择必装组件 MSVC 2015 64-bit
,如果后续使用 MinGW 编译则需安装对应组件,本文只介绍 VS 编译
注意:如果后续想使用 Qt Creator 开发,必须勾选 Qt Charts
,否则 qmake 时会报错
安装后配置环境变量
VS 中配置 Qt 关联,安装完后打开 VS,点击 Menu -> Qt VS Tools -> Qt Options
配置安装的 MSVC2015 组件
2.1 新建文件夹
2.2 运行 cmake-gui.exe
2.3 在 where is the source code
填入
目录
2.4 在 where to build the binaries
填入
目录
2.5 点击 configure,弹出选择编辑器的窗口,选择 Visual Studio 14 2015 Win64
(Win64 是指编译 VS2015 x64 工程,不带 Win64 的则为 x86 工程),默认第一个选项 Use default native compilers
2.6 配置完后会出现很多红色的配置项,搜索 extra
,在 OPENCV_EXTRA_MODULES_PATH
添加路径
2.7 (可选) 勾选 WITH_QT
,再次 configure 后会出现关于 Qt 的路径配置参数,确保与下图一致
2.8 勾选需要的配置,点击 configure 后再点击 generate,显示:
Configuring done
Generating done
3.1 在上述编译配置完成后,打开
,设置要编译的模式(debug 还是 release,本文选择的是 debug x64)
3.2 (可选)配置 Qt 的库链接(后续如果出现编译错误请参考 注意事项)
点击 Menu -> 视图 -> 其他窗口 -> 属性管理器
,打开 opencv_highgui -> Debug | x64 -> Microsoft.Cpp.x64.user
全局配置页,按下图配置
删除 opencv_highgui
和 opencv_cvv
项目属性配置页的多余配置
3.3 在解决方案的 CMakeTargets 文件夹下右击 ALL_BUILD
,选择 生成
(注意:耗费时间较长),成功后再右击 INSTALL
,选择 仅用于项目 -> 仅生成 INSTALL
,再次成功后,所编译的头文件和库在
文件夹下
3.4 配置 opencv 的环境变量,在 Path
中加入
打开 VS 2015,新建一个空白的 win32 的控制台工程
打开属性管理器中的全局配置页 Microsoft.Cpp.x64.user
,按下图配置
(注意:配置管理器中,Debug 和 Release 下的 Microsoft.Cpp.x64.user 是同一个文件,所以在生成不同模式时需要更改配置,否则编译会出错;该文件属于全局配置,所有 VS 项目不用再次配置)
3.1 运行 cmake-gui.exe
3.2 将 CMakeLists.txt 拖到 where is the source code
3.3 在 where to build the binaries
填入输出目录
3.4 点击 configure,弹出选择编辑器的窗口,选择 Visual Studio 14 2015 Win64
,默认第一个选项 Use default native compilers
3.5 运行完后出现 OpenCV 找不到的报错,修改配置 OPENCV_DIR
为
,然后再次 configure
3.6 点击 generate,最终解决方案会在输出目录中
注意:之前程序不运行时按 F12 能进入 opencv 源码,按该步骤操作后,必须在 debug 模式下,F11 进入 opencv 源码,F12 只能进入头文件,请斟酌操作
4.1 修改全局配置如下
4.2 点击 Menu -> 工具 -> 选项 -> 调试 -> 常规
,勾选 启用源服务器支持
及其子项
4.3 点击 Menu -> 工具 -> 选项 -> 调试 -> 符号
,添加并勾选符号文件位置
4.4 修改 opencv 的环境变量地址为
原因:可能是文件编码方式导致的
解决:在源码文件夹
中重新建立同名文本(删除原文件后改名),并复制cpp文件内容
原因:opencv 340 对 c++11 的兼容性问题,官方在 341 版本中已修复
解决:将源码文件
L436 替换成修复语句
# if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900/*MSVS 2015*/)
[1] OpenCV学习笔记(一)——OpenCV3.1.0+VS2015开发环境配置 - CSDN博客
[2] Visual Studio 2015一分钟配置opencv及CMake编译OpenCV3.1(含opencv-contrib) - CSDN博客
[3] CMake 简介和 CMake 模板 - 简书
[4] 调试opencv程序,怎么在vs运行下直接调到opencv的源码,终极,cmake后还要有pdb文件链接 - CSDN博客
[5] Win10+VS2013+CMake-gui编译和配置OpenCV-3.2.0 | Shaun’s Space
[6] Qt+Opencv+cmake在win10系统下的完美配置 - CSDN博客
[7] OpenCV3.2+Qt5.8.0+Win10配置和使用----(4)配置环境变量+编译opencv&opencv-contrib - CSDN博客
[8] OpenCV 3.4 编译和配置 - 胡马依北风 - 博客园
[9] Win10(x64)+Qt5.8(MSVC2015)+OpenCV3.2.0配置过程 - CSDN博客
1.1 下载 OpenCV 3.4.0 源码 opencv-3.4.0.zip
(假定目录为
)
1.2 下载 OpenCV_contrib 3.4.0 源码 opencv_contrib-3.4.0.zip
(假定目录为
)
注意:必须与 opencv 版本一致
1.3 安装 cmake-gui 3.11.1 x64 cmake 的 GUI 工具 cmake-3.11.1-win64-x64.msi
1.4 安装 Mingw 编译工具 mingw-get-setup.exe
(假定目录为
,此案例中为安装目录为 C:\MinGW)
可以选择 mingw32 或者 mingw64 都是可以的。后续采用的是 mingw32
选择需要安装的组件,右键选择 Mark for Installation
,之后选择 Menu -> Installation -> Apply Changes
(过程漫长)
新建系统变量/用户变量 MinGW
,目录为
,并将 %MinGW%\bin
添加进系统变量(需重启电脑生效)/用户变量(无需) Path
(建议用 编辑文本
检查下或直接点击 编辑文本
新增,避免出现多余的引号错误)
1.5 下载 Android NDK r15c x64 android-ndk-r15c-windows-x86_64.zip
(假定目录为
)
注意:r16b 版
的文件夹位置已移动到
,影响后续 cmake 编译
1.6 安装 java jdk 8 jdk-8u172-windows-x64.exe
jdk (假定目录为
)安装包包含 jre (假定目录为
)
安装后配置环境变量,新建系统变量/用户变量 JAVA_HOME
,目录为
,并将 %JAVA_HOME%\bin
添加到 Path
环境变量中
用 cmd 可测试是否正确安装与配置
1.7 安装 Android Studio android-studio-ide-173.4697961-windows.exe
官网中仅提供无 sdk 版,首次打开会提示 Unable to access Android SDK add-on list
原因:在第一次安装 AS,启动后检测到电脑没有 SDK
解决方案:点击 Cancel
,在后续的界面安装 SDK (需要下载)
1.8 安装 Android SDK >= 19 (假定目录为
)
注意:SDK 的版本安装全一点,从 API_LEVEL = 19 以上的都下了最好。可通过 AS 的 SDK Manager 管理安装
1.9 下载 Java ANT 1.10.3 apache-ant-1.10.3-bin.zip
(假定目录为
)
注意:1.9.x 依赖 Java5 runtime,1.10.x 依赖 Java8 runtime
2.1 新建文件夹
2.2 运行 cmake-gui.exe
2.3 在 where is the source code
填入
目录
2.4 在 where to build the binaries
填入
目录
2.5 点击 Add Entry,添加 ANDROID_NDK
,并设定为 PATH
类目,填入
目录
2.6 点击 Add Entry,添加 ANDROID_NDK_HOST_X64
,并设定为 BOOL
类目,勾选 (NDK 为 64 位版本则勾选,否则不勾选)
2.7 点击 Add Entry,添加 CMAKE_TOOLCHAIN_FILE
,并设定为 FILEPATH
类目,设置路径为
2.8 点击 Add Entry,添加 CMAKE_BUILD_WITH_INSTALL_RPATH
,并设定为 BOOL
类目,勾选
2.9 点击 Add Entry,添加 ANDROID_SDK
,并设定为 PATH
类目,设置路径为
2.10 点击 Add Entry,添加 ANDROID_ABI
,并设定为 STRING
类目,设置值为 armeabi-v7a
注意:这里的选项也即你需要编译的库类型,如果你想要编译 armeabi 或者 X86 都在这个值上修改 (cpu架构,只能一个一个编译)
2.11 点击 Add Entry,添加 ANDROID_NATIVE_API_LEVEL
,并设定为 STRING
类目,设置值为 19
注意:这里的选项也即你需要编译的 API-LEVEL,我定的是 19,你也可以用 20 或者 21;编译 x86 时可能需要设置高一些,例如 19 改为 21
2.12 点击 Add Entry,添加 ANDROID_EXECUTABLE
,并设定为 FILEPATH
类目,设置值为
(废弃:会导致编译问题)
注意:若没设置,会出现如下警告
警告1:OpenCV requires Android SDK tools revision 14 or newer.
警告2:Can not find any SDK target compatible with…
2.13 点击 Configure,选择 MinGW Makefile
作为编译选项,并在接下来的选项中选择 Specify toolchain file for cross-compiling
,点击 Next,对应的路径选择
,点击 Finish
等待configure完成,如下图所示:
2.14 修改 ANDROID_SDK_TARGET
键,将其值改为 android-23
(废弃)
2.15 添加 opencv-contrib 模块,搜索 extra
,在 OPENCV_EXTRA_MODULES_PATH
添加路径
2.16 重新添加 ANDROID_NDK,点击 Add Entry,添加 ANDROID_NDK
,并设定为 PATH
类目,对应目录为
后,再点击 configure
2.17 参数调整
/bin/ant.bat
(java 封装,便于 AS 导入模块,没有配置的话无法生成 libopencv_java3.so)2.18 修改 opencv-contrib 的对应 CMakeLists.txt
这是因为 Java 在调用 OpenCV 时,需要对应的 Java Wrapper。默认 opencv-contrib 是不编译生成 Java Wrapper 的。具体操作为:进入
每一个子目录中,在 CMakeLists.txt 文件中的
ocv_define_module(******)
ocv_define_module(****** WRAP python)
语句都统一改成
ocv_define_module(****** WRAP python java)
即在 ocv_define_module 没有 WRAP 或者有 WRAP 但没有包括 java 的,都更改为包含 WRAP Java
上诉设定调整好后,再次点击 configure 后再点击 generate,显示:
Configuring done
Generating done
在上述编译配置完成后,通过命令行工具 cmd (管理员身份) 进入
目录,执行
mingw32-make -j4
即可开始编译
但是执行到快要结束的时候会发生多个错误:
错误1
fatal error: opencv2/reg.hpp: No such file or directory
#include "opencv2/reg.hpp"
^
compilation terminated.
错误2
fatal error: opencv2/datasets.hpp: No such file or directory
#include "opencv2/datasets.hpp"
^
compilation terminated.
解决方案:
进入
打开 reg.cpp 注释掉
// #include "opencv2/reg.hpp"
打开 datasets.cpp 注释掉
// #include "opencv2/datasets.hpp"
然后执行
mingw32-make install
注意:这里千万别执行 mingw32-make -j4
不然仍然会出现这个错误。
一般而言,都会出现上面的错误,所以执行了 mingw32-make install
之后,如果类似下面的图片的话,整个编译库就编译和安装了 (相关的安装库在
中):
把 OpenCV 导入到项目中 (Menu -> File -> New -> Import_Module
)
/armeabi-v7a/install/sdk/java
接下来,Android Studio 开始导入 module ,完成后,能够看到 import-summary.txt
同时,你还会看到一个错误信息,说找不到 android-14 ,这是因为我们下载的 OpenCV 中的 build.gradle 里配置的是用 android API version 14 编译,默认情况下,我们的 Android SDK 里已经不包含 android-14 这个版本了
在 Android Studio 引入 OpenCVLiberary340 模块后,编辑 OpenCV 的 build.gradle:
application
为 apply plugin: com.android.library
applicationId "org.opencv"
为解决 android API 版本问题,需要对照 app 修改 OpenCV 的 build.gradle 参数
查看 app/build.gradle,对应修改 openCVLibrary340/build.gradle,然后在文本域上方点击 Try Again
同步配置
因为 app 里要使用 opencv 库里提供的方法,需要在 app 的依赖里增加刚导入进来的 opencv module
打开 project structure (Menu -> File -> Project_Structure
) 进行配置
复制
到项目 OpenCVTest1/openCVLibrary340/src/main
目录下,重命名为 jniLibs
;复制
到项目 OpenCVTest1/openCVLibrary340/src/main/cpp
目录下;并在 app/build.gradle 添加以下代码:
sourceSets.main {
jniLibs.srcDirs = ['src/main/libs', 'src/main/jniLibs']
jni.srcDirs = []
}
代码中不使用 OpenCVLoader.initAsync(...)
CMakeLists 的主要作用就是告诉NDK我的源代码有哪些,要包含哪些头文件,我的第三方依赖库有哪些,要用什么方式编译
该文件没有配置好的话会影响编译
注意:不管是Windows系统还是Linux系统,cmake中的路径分割符均为 /
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_VERBOSE_MAKEFILE on)
set(libs ${PROJECT_SOURCE_DIR}/src/main/jniLibs)
include_directories(${PROJECT_SOURCE_DIR}/src/main/cpp/include)
add_library(libopencv_java3 SHARED IMPORTED )
set_target_properties(libopencv_java3 PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_java3.so")
add_library(libopencv_calib3d STATIC IMPORTED )
set_target_properties(libopencv_calib3d PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_calib3d.a")
add_library(libopencv_core STATIC IMPORTED )
set_target_properties(libopencv_core PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_core.a")
add_library(libopencv_features2d STATIC IMPORTED )
set_target_properties(libopencv_features2d PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_features2d.a")
add_library(libopencv_flann STATIC IMPORTED )
set_target_properties(libopencv_flann PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_flann.a")
add_library(libopencv_highgui STATIC IMPORTED )
set_target_properties(libopencv_highgui PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_highgui.a")
add_library(libopencv_imgcodecs STATIC IMPORTED )
set_target_properties(libopencv_imgcodecs PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_imgcodecs.a")
add_library(libopencv_imgproc STATIC IMPORTED )
set_target_properties(libopencv_imgproc PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_imgproc.a")
add_library(libopencv_ml STATIC IMPORTED )
set_target_properties(libopencv_ml PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_ml.a")
add_library(libopencv_objdetect STATIC IMPORTED )
set_target_properties(libopencv_objdetect PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_objdetect.a")
add_library(libopencv_photo STATIC IMPORTED )
set_target_properties(libopencv_photo PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_photo.a")
add_library(libopencv_shape STATIC IMPORTED )
set_target_properties(libopencv_shape PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_shape.a")
add_library(libopencv_stitching STATIC IMPORTED )
set_target_properties(libopencv_stitching PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_stitching.a")
add_library(libopencv_superres STATIC IMPORTED )
set_target_properties(libopencv_superres PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_superres.a")
add_library(libopencv_video STATIC IMPORTED )
set_target_properties(libopencv_video PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_video.a")
add_library(libopencv_videoio STATIC IMPORTED )
set_target_properties(libopencv_videoio PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_videoio.a")
add_library(libopencv_videostab STATIC IMPORTED )
set_target_properties(libopencv_videostab PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_videostab.a")
add_library(libopencv_ts STATIC IMPORTED )
set_target_properties(libopencv_ts PROPERTIES
IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_ts.a")
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp )
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
target_link_libraries( # Specifies the target library.
native-lib android log
libopencv_java3
libopencv_calib3d
libopencv_core
libopencv_features2d
libopencv_flann
libopencv_highgui
libopencv_imgcodecs
libopencv_imgproc
libopencv_ml
libopencv_objdetect
libopencv_photo
libopencv_shape
libopencv_stitching
libopencv_superres
libopencv_video
libopencv_videoio
libopencv_videostab
# Links the target library to the log library
# included in the NDK.
${log-lib} )
修改文件 MainActivity.java,添加引用
import org.opencv.android.OpenCVLoader;
import android.util.Log;
在函数 onCreate 最后增加如下代码,加载OpenCV动态链接库,最然后重新编译 (Menu -> Build -> Rebuild Project
)。
if (!OpenCVLoader.initDebug()) {
Log.e(this.getClass().getSimpleName(), "OpenCVLoader.initDebug(), not working.");
} else {
Log.d(this.getClass().getSimpleName(), "OpenCVLoader.initDebug(), working.");
}
Execution Failed for task :app:compileDebugJavaWithJavac in Android Studio
未找到原因,直接删掉无法编译的库 openCVLibrary340/src/main/java/org/opencv/bgsegm 和 optflow 目录,重新编译。
如果您想要将 Gradle 关联到现有 ndk-build 项目,请使用 ndkBuild {} 块而不是 cmake {},并提供 Android.mk 文件的相对路径。如果 Application.mk 文件与您的 Android.mk 文件位于相同目录下,Gradle 也会包含此文件。建议使用 cmake。
error: ‘src/main/jniLibs/armeabi-v7a/libopencv_java3.so’, needed by ‘…/…/…/…/build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so’, missing and no known rule to make it
解决:使用 PROJECT_SOURCE_DIR
当前工程的源码路径
如果是ABI类型错误,则需要在app\build.gradle中设置abiFilters
因为opencv要在横屏时才能得到较好的结果,那么我可以先把竖屏时得到的图像顺时针旋转90度,这样就和横屏时一样了。在 openCVLibrary340/src/main/java/org/opencv/android/CameraBridgeViewBase.java
文件修改 deliverAndDrawFrame() 函数中,修改以下部分
if (canvas != null) {
canvas.rotate(90,0,0);
float scale = canvas.getWidth() / (float)mCacheBitmap.getHeight();
float scale2 = canvas.getHeight() / (float)mCacheBitmap.getWidth();
if(scale2 > scale){
scale = scale2;
}
if (scale != 0) {
canvas.scale(scale, scale,0,0);
}
canvas.drawBitmap(mCacheBitmap, 0, -mCacheBitmap.getHeight(), null);
// canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);
Log.d(TAG, "mStretch value: " + mScale);
/* if (mScale != 0) {
canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
new Rect((int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2),
(int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2),
(int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2 + mScale*mCacheBitmap.getWidth()),
(int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2 + mScale*mCacheBitmap.getHeight())), null);
} else {
canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
new Rect((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,
(canvas.getHeight() - mCacheBitmap.getHeight()) / 2,
(canvas.getWidth() - mCacheBitmap.getWidth()) / 2 + mCacheBitmap.getWidth(),
(canvas.getHeight() - mCacheBitmap.getHeight()) / 2 + mCacheBitmap.getHeight()), null);
}*/
...
}
Unknown failure (at android.os.Binder.execTransact(Binder.java:697))
Error while Installing APKs
解决:打开配置 Menu -> File -> Settings -> Build, Execution, Deployment -> Instant Run
去掉第一个 Enable 的勾选,关闭快速运行
原因:没有启动OpenCV,无法使用OpenCV中的类给对象初始化。一般OpenCV的启动都选择在OnResume方法中完成,也就是说,在OnResume方法之前调用OpenCV中的任意方法都是错误的。
解决:在 onResume 中检测OpenCV的库文件是否加载完毕,加载完毕再运行
private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
//DO YOUR WORK/STUFF HERE
Log.i("OpenCV", "OpenCV loaded successfully.");
break;
default:
super.onManagerConnected(status);
break;
}
}
};
@Override
public void onResume(){
super.onResume();
//检测OpenCV的库文件是否加载完毕
if (!OpenCVLoader.initDebug()) {
Log.d("OpenCV", "Internal OpenCV library not found. Using OpenCV Manager for " +
"initialization");
//OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0, this, baseLoaderCallback); // not access OpenCV Manager
} else {
Log.d("OpenCV", "OpenCV library found inside package. Using it!");
mOpenCVCallBack.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
解决:在所有缺失引用的文件下添加对应引用:import org.opencv.video.BackgroundSubtractor; / import org.opencv.video.DenseOpticalFlow;