Android studio中使用OpenCV C++库

1.下载opencv-mobile4.6.0Release 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);
相关推荐
luj_176817 小时前
桥牌思维启示:系统设计的模块化架构
c语言·开发语言·c++·经验分享·算法
会周易的程序员17 小时前
aiDgePLC iec61131 虚拟机 完整使用文档
c++·物联网·架构·st·iec61131
小小龙学IT18 小时前
Boost.Beast 深度实战:基于 Asio 的开源 C++ HTTP/WebSocket 协议库
c++·websocket·http
不可求~19 小时前
C++ std::string_view 不是字符串:从悬空引用到安全用法
java·开发语言·c++
小小龙学IT20 小时前
C++ 正则表达式完全指南:从 std::regex 实战到 RE2 引擎原理(NFA/DFA/回溯陷阱)
c++·正则表达式
启雀AI21 小时前
培训平台移动端离线学习方案设计与实现:视频缓存、断点续传与进度同步的工程实践
android·学习·缓存·音视频·企业lms
我命由我123451 天前
RxJava - 冷数据流与热数据流
android·java·java-ee·android studio·rxjava·android-studio·android runtime
码匠许师傅1 天前
【C++ 面试真题】聊聊 C++ 的序列容器
java·c++·面试
W_326001 天前
Python-OpenCV图像像素与通道:通道拆分合并、深浅拷贝
图像处理·人工智能·python·opencv·机器学习
C++ 老炮儿的技术栈1 天前
Qt5.9.1 Windows 完整开发环境搭建流程
开发语言·c++·windows·qt·编辑器·代码化