当前位置: 首页 > 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 相结合。
http://www.lryc.cn/news/497321.html

相关文章:

  • nodejs循环导出多个word表格文档
  • elasticsearch-如何给文档新增/更新的字段
  • https/http访问接口工具类,附带ssl忽略证书验证,以及head头部的添加-java版
  • node.js基础学习-express框架-静态资源中间件express.static(十一)
  • Python语法基础---正则表达式
  • Uniapp 微信小程序分享 - 自定义绘制分享图片
  • 鸿蒙技术分享:Navigation页面容器封装-鸿蒙@fw/router框架源码解析(三)
  • 三步入门Log4J 的使用
  • VBA中类的解读及应用第十八讲:利用类方法,判断任意单元格类型
  • 查询品牌涉及两张表(brand、brand_admin_mapping)
  • Eureka和Zookeeper、Nacos的区别
  • 微信小程序怎么实现非tabbar页面显示tabbar,自定义组件实现
  • SpringBoot如何使用EasyExcel实现表格导出(简洁快速入门版本)
  • 多种平台上安装部署调试Open5GS(四)
  • 单片机的基本构成与工作原理
  • opencv常用图像处理操作
  • Svn如何切换删除账号
  • 使用PaddleOCR遇到的问题Bug
  • 了解Xcode在iOS开发中的作用和功能有哪些
  • 《船舶物资与市场》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • 商汤完成组织架构调整,改革完成的商汤未来何在?
  • MyBatis异常体系中ErrorContext和ExceptionFactory原理分析
  • WHLUG丨deepin、华中科技大学开放原子开源俱乐部、 RustSBI 和清华大学开源操作系统训练营共话开源新生代成长之路
  • 通过HTML Canvas 在图片上绘制文字
  • C# 冒泡的算法
  • 大数据项目-Django基于聚类算法实现的房屋售房数据分析及可视化系统
  • AWS创建ec2实例并连接成功
  • TypeScript 开始学习 -接触的新东西
  • 非对称任意进制转换器(安卓)
  • 【优选算法篇】寻找隐藏的宝藏:用二分查找打开算法世界的大门(上篇)