1.下载opencv-mobile4.6.0 (Release v16)

2.解压放入app/src/main/cpp/目录下

3.修改CMakeList.txt
在add_library主模块之后(放之前会报错),加入如下代码
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv-mobile-4.6.0-android/sdk/native/jni)
find_package(OpenCV REQUIRED)
find_package(OpenMP REQUIRED)
if(OpenMP_FOUND)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS} -static-openmp")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -static-openmp")
endif()
target_link_libraries中加入
${OpenCV_LIBS}
OpenMP::OpenMP_CXX


4.在app/build.gradle中加入
cmake {
cppFlags "-std=c++17 -fopenmp -static-openmp"
abiFilters 'arm64-v8a'
}

5.测试画圆(可在子线程中使用)
cpp
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
...
cv::Mat mat(player.codecCtx->height,player.codecCtx->width,CV_8UC4,player.buffer);
cv::circle(mat, cv::Point(30, 250), 20,cv::Scalar(127, 0, 127), 2);
显示到界面中(片断)
cpp
ANativeWindow_Buffer windowBuffer;
ARect dirtyRect;
// 调用回调函数
if (ANativeWindow_lock(player.nativeWindow, &windowBuffer, &dirtyRect) != 0)
{
return;
}
// 逐行拷贝:处理窗口stride与图像stride不一致的情况
uint8_t* dst = static_cast<uint8_t*>(windowBuffer.bits);
int dstStride = windowBuffer.stride * 4; // 每行字节数
int srcStride = mat.step[0]; // mat每行字节
for (int y = 0; y < player.codecCtx->height; y++)
{
const uint8_t* srcRow = mat.ptr<uint8_t>(y);
uint8_t* dstRow = dst + y * dstStride;
memcpy(dstRow, srcRow, srcStride);
}
// 解锁并提交画面显示
ANativeWindow_unlockAndPost(player.nativeWindow);