OpenCV 4.5.5 cpp & Android 学习问题合集

OpenCV Android SDK Samples笔记

初学者的猜测,任何位置都可能有错。

项目总体配置方法

Windows:在OpenCV-android-sdk/samples文件夹上右键打开为Android Studio项目,gradle自动配置好之后即可。

6. tutorial-2-mixedprocessing

该模块应该是通过OpenCV处理相机返回帧实现效果,展示了Java包装类和直接JNI调用处理的模板编程方式。
该模块最让人感兴趣的是JNI混合编程的方式,其中的关键方法是FindFeatures,通过org.opencv.core.Mat的实例方法getNativeObjAddr()返回C++对象的内存地址,因此JNI的C++部分可以只接受长整型的内存地址,进而通过类型转换获得cv::Mat引用,实现在JNI层对Mat对象内容进行操作。

public native void FindFeatures(long matAddrGr, long matAddrRgba);

该模块的jni文件夹内应该提供了两种NDK的支持方式:一种是用安卓的make文件,即Android.mk和Application.mk支持;另一种是用新版Android Studio支持CMake的特性,用CMakeLists.txt文件支持。
下面简单介绍第二种方法的理解,使用Android Studio创建C++ Native项目后会获得基础的CMakeLists.txt和native-lib.cpp,在此基础上简单修改即可。

# OpenCV Sample 6 tutorial-2-mixedprocessing jni/CMakeLists.txt
cmake_minimum_required(VERSION 3.6)

# 设置target变量作为库名,并设置语言为C++
set(target mixed_sample)
project(${target} CXX)

# 设置OpenCV要加载的组件为opencv_java,打印Android的ABI信息,引入OpenCV
set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "")
message(STATUS "ANDROID_ABI=${ANDROID_ABI}")
# 注意:这里实际上在设置了一个OpenCV_DIR的变量,指向OpenCV native sdk路径,即OpenCV-android-sdk\sdk\native\jni。
# OpenCV_DIR可以选择在自己开发的时候需要手动设置并指向相应位置,如下一个代码块。
# 也可以参考OpenCV sample中模块gradle中的写法
# externalNativeBuild {
#     cmake {
#         arguments "-DOpenCV_DIR=" + project(':opencv').projectDir + "/native/jni"
#     }
# }
find_package(OpenCV REQUIRED COMPONENTS ${ANDROID_OPENCV_COMPONENTS})

file(GLOB srcs *.cpp *.c)
file(GLOB hdrs *.hpp *.h)

# OpenCV Sample自己写了个头文件,所以要包含,不写可以不加
include_directories("${CMAKE_CURRENT_LIST_DIR}")
add_library(${target} SHARED ${srcs} ${hdrs})
target_link_libraries(${target} ${ANDROID_OPENCV_COMPONENTS})

下面是一个测试项目的示例

cmake_minimum_required(VERSION 3.18.1)
project("test")

# 设置OpenCV_DIR的变量,指向OpenCV native sdk路径
set(OpenCV_DIR "C:/soft/OpenCV-android-sdk/sdk/native/jni")
set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "")
find_package(OpenCV REQUIRED COMPONENTS ${ANDROID_OPENCV_COMPONENTS})

add_library(test SHARED native-lib.cpp)

find_library(log-lib log)

target_link_libraries(test ${log-lib} ${ANDROID_OPENCV_COMPONENTS})

1.VideoCapture读取不了mp4视频

实际原因是opencv处理中文字符会出错,这个问题有待解决

2.Android OpenCV 色彩空间顺序是RGB

OpenCV Android SDK Utils.bitmapToMat是按安卓加载Bitmap的颜色顺序RGB产生Mat的,而不是BGR
先发出来占个坑,每天就两篇

3.Cleartext HTTP traffic to not permitted

高版本安卓(API 28,版本9.0以上)不允许明文网络传输数据,如果只是为了学习或者内部使用可以修改网络配置以允许明文传输。修改项目的AndroidManifest.xml文件,在指定的application标签内添加android:usesCleartextTraffic="true"


    
    

参考:Android高版本联网失败报错:Cleartext HTTP traffic to xxx not permitted解决方法

4. Android Studio Debug启动相关

可能出现的情况有:

  1. Wating for applicatoin to start debug server
  2. Waiting for application to come online
  3. AndroidStudio 高版本deBug,无法安装或启动失败问题
    参考各网站,重启Android Studio,模拟器和电脑,清除模拟器数据,模拟器冷启动等等。除了重启电脑可能会好使一次以外,其他没什么用。
    目前可能有用的一招是gradle文件内添加选项,有人说混淆可能会导致无法调试,不过我这里可能有用的只有debuggable选项打开,但也不是很稳定。
    我自己猜测的一种可能是Debugger启动的虚拟机端口被新版Windows系统(2004以后)占用了,导致连不上。
android {
    buildTypes {
        debug {
            minifyEnabled false
            debuggable true
        }
    }
}

参考AndroidStudio 高版本Debug,无法安装或启动失败问题

5. opencv.js的色彩通道默认是RGB而非BGR,opencv-python的色彩通道默认是BGR,但是这取决于处理的图片是用什么库加载的。

参考Basic Operations on ImagesSplitting and Merging Image Channels小节,分离通道后取出的第一个通道默认为红色R,笔者的实验也表明是RGB。

题外话 How to fix could not find or load the Qt platform plugin windows

参考How to fix "could not find or load the Qt platform plugin windows" while using Matplotlib in PyCharm
参考Osama Adly老哥的回答。这个跟Anaconda有关,直接原因是PyQt和PySide的Qt动态链接库大版本不同。Anaconda自带一个PyQt5,但是它可能自身有一些软件依赖PyQt5,就把PyQt5包拆开安装了,导致Anaconda环境内默认调用的都是PyQt5的动态链接库。比如说我在Anaconda 2021.11装的Python里装了个PySide6,而Anaconda自带PyQt5,两者的关于平台的动态链接库名称都是下面那三个,而两者对应的Qt大版本不同,所以会出错。如果我在空的环境内装PyQt6/PyQt5和PySide6时,它们调用的动态链接库是互相独立的,不同Qt大版本的动态链接库库名相同,相同大版本的库大小相同,估计内容是一样的。
If you are running PyQt5 and PySide2, this solved the problem for me:
Copy the following files:

\Anaconda3\Lib\site-packages\PySide2\plugins\platforms\qminimal.dll
\Anaconda3\Lib\site-packages\PySide2\plugins\platforms\qoffscreen.dll
\Anaconda3\Lib\site-packages\PySide2\plugins\platforms\qwindows.dll

to:

\Anaconda3\Library\plugins\platforms\

你可能感兴趣的:(OpenCV 4.5.5 cpp & Android 学习问题合集)