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 PROPERTIES
    IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libopencv_java4.so)

# 链接库
target_link_libraries(
        image_processor
        opencv_java4
        log) # 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);

    @Override
    protected 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 相结合。
相关推荐
sali-tec5 分钟前
C# 基于OpenCv的视觉工作流-章52-交点查找
图像处理·人工智能·opencv·算法·计算机视觉
仙女修炼史34 分钟前
CNN的捷径学习Shortcut Learning in Deep Neural Networks
人工智能·学习·cnn
JMchen12344 分钟前
第 3 篇|Android 项目结构解析与第一个界面 —— Hello, CSDN!
android·android studio·android 零基础·android 项目结构·android 界面开发
亚空间仓鼠1 小时前
网络学习实例:网络理论知识
网络·学习·智能路由器
薛定e的猫咪2 小时前
多智能体强化学习求解 FJSP 变体全景:动态调度、AGV 运输、绿色制造与开源代码导航
人工智能·学习·性能优化·制造
风兮雨露2 小时前
一建学习流程以及计划(附资料)
学习
星幻元宇VR3 小时前
VR单人地震体验平台,学习科学避险
科技·学习·安全·vr·虚拟现实
坚持就完事了3 小时前
Hadoop实战初步学习
hadoop·学习
for_ever_love__3 小时前
UI学习:多界面传值的正向传值(属性传值)和反向传值(代理传值)
学习·ui·ios·objective-c
zhangrelay3 小时前
蓝桥云课五分钟-通关自动控制-octave
笔记·学习