当前位置: 首页 > news >正文

Android学习8 -- NDK2--练习2(Opencv)

以下是一个简单的安卓项目示例,通过NDK调用OpenCV来处理图像(例如,将彩色图像转换为灰度图像)。


开发环境

  1. 安装 Android Studio(支持NDK开发)。
  2. 配置NDK和CMake(通过Android Studio的SDK Manager)。
  3. 下载OpenCV Android库:OpenCV Releases

步骤

1. 下载并配置OpenCV
  • 下载OpenCV Android库,解压后会有一个 sdk 文件夹。
  • sdk/native/libs 文件夹中的 .so 文件和 include 目录添加到项目中:
    • .so 文件放到 app/src/main/jniLibs/<ABI>/ 目录,例如 armeabi-v7a
    • include 文件夹放到 app/src/main/cpp/include

2. 创建Android项目
  • 创建一个新项目并选择 Include C++ Support

3. 添加C++代码

创建 cpp/image_processor.cpp

#include <jni.h>
#include <opencv2/opencv.hpp>
#include <android/log.h>#define LOG_TAG "ImageProcessor"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)extern "C" JNIEXPORT void JNICALL
Java_com_example_opencvndk_MainActivity_convertToGray(JNIEnv *env, jobject /* this */, jlong inputMatAddr, jlong outputMatAddr) {cv::Mat &inputMat = *(cv::Mat *) inputMatAddr;cv::Mat &outputMat = *(cv::Mat *) outputMatAddr;if (inputMat.empty()) {LOGD("Input image is empty!");return;}cv::cvtColor(inputMat, outputMat, cv::COLOR_BGR2GRAY);
}

4. 修改 CMakeLists.txt

app/src/main/cpp/CMakeLists.txt 中:

cmake_minimum_required(VERSION 3.10.2)
project("opencvndk")# 添加 OpenCV 头文件路径
include_directories(${CMAKE_SOURCE_DIR}/include)# 添加库
add_library(image_processor SHARED image_processor.cpp)# 指定 OpenCV 动态库路径
add_library(opencv_java4 SHARED IMPORTED)
set_target_properties(opencv_java4 PROPERTIESIMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libopencv_java4.so)# 链接库
target_link_libraries(image_processoropencv_java4log) # log 库用于 Android 日志

5. 编写JNI接口

MainActivity.java 中:

package com.example.opencvndk;import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.android.Utils;
import android.widget.ImageView;public class MainActivity extends AppCompatActivity {static {System.loadLibrary("image_processor");}private native void convertToGray(long inputMatAddr, long outputMatAddr);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (!OpenCVLoader.initDebug()) {throw new RuntimeException("Unable to load OpenCV");}// 加载图片Mat inputMat = Imgcodecs.imread("/sdcard/input.jpg");Mat outputMat = new Mat();// 调用 JNI 转灰度convertToGray(inputMat.getNativeObjAddr(), outputMat.getNativeObjAddr());// 显示图片ImageView imageView = findViewById(R.id.imageView);imageView.setImageBitmap(Utils.matToBitmap(outputMat));}
}

6. 配置 AndroidManifest.xml

确保权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

7. 运行项目
  1. 将一张彩色图片(如 input.jpg)放在设备的 /sdcard 目录下。
  2. 运行项目,可以看到图片被转换为灰度。

扩展功能

  • 添加更多OpenCV图像处理功能,如边缘检测、模糊处理等。
  • 实现视频实时处理功能,使用 CameraX 和 OpenCV 相结合。

相关文章:

Android学习8 -- NDK2--练习2(Opencv)

以下是一个简单的安卓项目示例&#xff0c;通过NDK调用OpenCV来处理图像&#xff08;例如&#xff0c;将彩色图像转换为灰度图像&#xff09;。 开发环境 安装 Android Studio&#xff08;支持NDK开发&#xff09;。配置NDK和CMake&#xff08;通过Android Studio的SDK Manage…...

nodejs循环导出多个word表格文档

文章目录 nodejs循环导出多个word表格文档一、文档模板编辑二、安装依赖三、创建导出工具类exportWord.js四、调用五、效果图nodejs循环导出多个word表格文档 结果案例: 一、文档模板编辑 二、安装依赖 // 实现word下载的主要依赖 npm install docxtemplater pizzip --save/…...

elasticsearch-如何给文档新增/更新的字段

文章目录 前言elasticsearch-如何给文档新增/更新的字段1. 如何给某些文档新增/更新的字段2. 给所有文档添加/更新一个新的字段3. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且…...

https/http访问接口工具类,附带ssl忽略证书验证,以及head头部的添加-java版

复制即用 package utils;import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;import javax.net.ssl.*; import java.io.BufferedReader; import java.io.IOException; impo…...

node.js基础学习-express框架-静态资源中间件express.static(十一)

前言 在 Node.js 应用中&#xff0c;静态资源是指那些不需要服务器动态处理&#xff0c;直接发送给客户端的文件。常见的静态资源包括 HTML 文件、CSS 样式表、JavaScript 脚本、图片&#xff08;如 JPEG、PNG 等&#xff09;、字体文件和音频、视频文件等。这些文件在服务器端…...

Python语法基础---正则表达式

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们这个文章所讲述的&#xff0c;也是数据分析的基础文章&#xff0c;正则表达式 首先&#xff0c;我们在开始之前&#xff0c;引出一个问题。也是我们接下来想要解决的问题。…...

Uniapp 微信小程序分享 - 自定义绘制分享图片

技术栈&#xff1a; Uniapp Vue3 简介 因实际业务需求&#xff0c;需要实现微信小程序自定义分享&#xff0c;根据当前数据动态生成&#xff08;绘制&#xff09;分享卡片的图片。 基础分享使用 配置此处不在赘述&#xff0c;可查看上篇博客&#xff1a;Uniapp 微信小程序分…...

鸿蒙技术分享:Navigation页面容器封装-鸿蒙@fw/router框架源码解析(三)

本文是系列文章&#xff0c;其他文章见&#xff1a;鸿蒙fw/router框架源码解析&#xff08;一&#xff09;-router页面管理鸿蒙fw/router框架源码解析&#xff08;二&#xff09;-Navigation页面管理鸿蒙fw/router框架源码解析&#xff08;四&#xff09;-路由Hvigor插件实现原…...

三步入门Log4J 的使用

本篇基于Maven 的Project项目&#xff0c; 快速演示Log4j 的导入和演示。 第一步&#xff1a; 导入Log4j依赖 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.24.2</version&…...

VBA中类的解读及应用第十八讲:利用类方法,判断任意单元格类型

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…...

查询品牌涉及两张表(brand、brand_admin_mapping)

文章目录 1、BrandController2、AdminCommonService3、BrandApiService3、BrandCommonService4、BrandSqlService涉及的表SQL 查询逻辑参数处理执行查询完整 SQL 逻辑参数映射总结 查询指定管理员下的品牌所涉及的表有哪些&#xff1f; http://127.0.0.1:8087/brand/admin/list…...

Eureka和Zookeeper、Nacos的区别

目录 一、Eureka与Zookeeper的区别 适用场景&#xff1a; 架构设计&#xff1a; 功能特性&#xff1a; 社区生态&#xff1a; 二、Eureka与Nacos的区别 接口方式&#xff1a; 实例类型&#xff1a; 健康检测&#xff1a; 服务发现&#xff1a; 一致性与可用性&#…...

微信小程序怎么实现非tabbar页面显示tabbar,自定义组件实现

微信小程序没有发现可以实现非tabbar页面显示tabbar的方法&#xff0c;但是可以在tabbar页面当中隐藏tabbar&#xff0c;使用wx.hideTabBar()方法就可以实现&#xff0c;在非tabbar页面调用wx.showTabBar()方法却会显示失败&#xff0c;不能显示tabbar onLoad() {wx.showTabBar…...

SpringBoot如何使用EasyExcel实现表格导出(简洁快速入门版本)

前言 前面给大家介绍了动态表头的导入&#xff0c;这篇文章给大家介绍如何实现导出 前面给大家介绍了动态表头的导入&#xff0c;我们了解了如何通过EasyExcel灵活地读取结构不固定的Excel文件。这次&#xff0c;我们将目光转向数据导出——即如何将数据以Excel文件的形式输出…...

多种平台上安装部署调试Open5GS(四)

OpenWRT 源码安装 UERANSIM 安装依赖openwrt源码安装cmake其他依赖准备UERANSIM安装测试验证Open5GS 是一个功能完善的开源5G项目,具备5G、4G核心网功能,最新代码支持R17标准, 本系列文章介绍Open5GS在x86、ARM平台上的安装部署方法,并通过搭建UERANSIN、商用5G基站和终端两…...

单片机的基本构成与工作原理

单片机&#xff0c;即微控制器&#xff08;Microcontroller Unit&#xff0c;MCU&#xff09;&#xff0c;是一种将中央处理器(CPU)、存储器(ROM/RAM)、定时/计数器(Timer/Counter)、中断系统、输入输出(I/O)接口等集成在一块芯片上的微型计算机。它具有体积小、功耗低、成本低…...

opencv常用图像处理操作

OpenCV 处理图像的通用流程通常包括以下几个步骤&#xff0c;根据具体需求可以调整或跳过某些步骤。以下是一个通用的框架&#xff1a; 读取图像 加载图像文件到内存中以进行后续处理。 import cv2 读取图像 image cv2.imread(‘image.jpg’) # 彩色图像 gray_image cv2…...

Svn如何切换删除账号

记录Svn清除切换账号 1.首先打开小乌龟的设置如下图 打开设置后单击已保存数据&#xff0c;然后选择清除 接上图选择清除后&#xff0c;就可以打勾选择清除已保存的账号&#xff0c;我们再次检出的就可以切换账号了 &#x1f449;总结 本次记录Svn清除切换账号 如能帮助到你…...

使用PaddleOCR遇到的问题Bug

Q1: 训练模型的预测效果比inference模型的预测效果差距很大,怎么办?原因是什么? A1: 训练模型:使用训练数据集进行训练后的模型。 inference模型:把模型结构和模型参数保存在文件中的固化模型,多用于预测部署场景。训练过程中保存的模型是checkpoints模型,保存的只有模…...

了解Xcode在iOS开发中的作用和功能有哪些

Xcode是什么&#xff1f;它在iOS开发中的作用和功能有哪些&#xff1f; 一、Xcode是什么&#xff1f; Xcode是苹果公司针对macOS平台开发的一款集成开发环境&#xff08;Integrated Development Environment&#xff0c;简称IDE&#xff09;。它主要用于开发iOS、iPadOS、mac…...

《船舶物资与市场》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《船舶物资与市场》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《船舶物资与市场》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国船舶集团有限公司 主办单…...

商汤完成组织架构调整,改革完成的商汤未来何在?

首先&#xff0c;从核心业务的角度来看&#xff0c;商汤科技通过新架构明确了以AI云、通用视觉模型等为核心业务的战略方向。这一举措有助于商汤科技集中资源&#xff0c;加强在核心业务领域的研发和市场拓展&#xff0c;提高市场竞争力。同时&#xff0c;坚定生成式AI为代表的…...

MyBatis异常体系中ErrorContext和ExceptionFactory原理分析

&#x1f3ae; 作者主页&#xff1a;点击 &#x1f381; 完整专栏和代码&#xff1a;点击 &#x1f3e1; 博客主页&#xff1a;点击 文章目录 exceptions包分包设计ExceptionFactory类介绍为什么使用工厂不是直接new呢&#xff1f;【统一的异常处理机制】【异常的封装与转化】【…...

WHLUG丨deepin、华中科技大学开放原子开源俱乐部、 RustSBI 和清华大学开源操作系统训练营共话开源新生代成长之路

2024年11月30日下午&#xff0c;由 deepin&#xff08;深度&#xff09;社区联合华中科技大学开放原子开源俱乐部、 RustSBI 开源社区和清华大学开源操作系统训练营共同举办的WHLUG&#xff08;武汉Linux用户组&#xff09;线下沙龙在华中科技大学成功举办。 本次活动聚集了50余…...

通过HTML Canvas 在图片上绘制文字

目录 前言 一、HTML Canvas 简介 二、准备工作 三、绘制图片 四、绘制文字 五、完整代码 效果演示&#xff1a; 前言 HTML canvas 为我们提供了无限的创意可能性。今天&#xff0c;我们就来探索一下如何通过 HTML canvas 将图片和文字绘制到图片上&#xff0c;创造出独特…...

C# 冒泡的算法

C# 冒泡的算法 public void BubbleSort(int[] arr) {int temp;for (int j 0; j < arr.Length - 2; j){for (int i 0; i < arr.Length - 2; i){if (arr[i] > arr[i 1]){temp arr[i 1];arr[i 1] arr[i];arr[i] temp;}}} }使用方法 int[] array new int[] { 5,…...

大数据项目-Django基于聚类算法实现的房屋售房数据分析及可视化系统

《[含文档PPT源码等]精品Django基于聚类算法实现的房屋售房数据分析及可视化系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程课程答疑等&#xff01; 数据库管理工具&#xff1a;phpstudy/Navicat或者phpstudy/sqlyog 后台管理系统涉及技术&#xff1a; 后台使…...

AWS创建ec2实例并连接成功

aws创建ec2实例并连接 aws创建ec2并连接 1.ec2创建前准备 首先创建一个VPC隔离云资源并且有公有子网 2.创建EC2实例 1.启动新实例或者创建实例 2.创建实例名 3.选择AMI使用linux(HVM) 4.选择实例类型 5.创建密钥对下载到本地并填入密钥对名称 6.选择自己创建的VPC和公有子网…...

TypeScript 开始学习 -接触的新东西

目录 语言类型类型总览JavaScript 中的数据类型TypeScript 中的数据类型 定义类型断言索引签名泛型 语言类型 JS -> 弱类型 TS -> 强类型 TypeScript&#xff08;TS&#xff09;是一种强类型语言。‌这意味着在TypeScript中&#xff0c;变量和函数参数的类型必须在编译时…...

非对称任意进制转换器(安卓)

除了正常进制转换&#xff0c;还可以输入、输出使用不同的数字符号&#xff0c;达成对数值进行加密的效果 点我下载APK安装包 使用unity开发。新建一个c#代码文件&#xff0c;把代码覆盖进去&#xff0c;再把代码文件添加给main camera即可。 using System.Collections; usin…...