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 相结合。
相关推荐
leegong2311122 分钟前
学习PostgreSQL专家认证
数据库·学习·postgresql
Moonnnn.1 小时前
51单片机学习——动态数码管显示
笔记·嵌入式硬件·学习·51单片机
南宫生2 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
技术小齐2 小时前
网络运维学习笔记 016网工初级(HCIA-Datacom与CCNA-EI)PPP点对点协议和PPPoE以太网上的点对点协议(此处只讲华为)
运维·网络·学习
竹言笙熙2 小时前
代码审计初探
学习·web安全
日记成书2 小时前
物联网智能项目
物联网·学习
虾球xz3 小时前
游戏引擎学习第118天
学习·游戏引擎
gz927cool3 小时前
大模型做导师之开源项目学习(lightRAG)
学习·开源·mfc
simplepeng3 小时前
我的天,我真是和androidx的字体加载杠上了
android
世事如云有卷舒5 小时前
FreeRTOS学习笔记
笔记·学习