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 相结合。
相关推荐
玲小珑4 分钟前
Auto.js 入门指南(八)高级控件与 UI 自动化
android·前端
harry235day17 分钟前
Compose 带动画的待办清单列表页
android·android jetpack
vocal17 分钟前
我的安卓第一课:四大组件之一Activity及其组件RecyclerView
android
凌辰揽月35 分钟前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
咕噜企业签名分发-淼淼42 分钟前
如何实现安卓端与苹果端互通的多种方案
android
whoarethenext1 小时前
使用 C/C++的OpenCV 实时播放火柴人爱心舞蹈动画
c语言·c++·opencv
wu_android1 小时前
Android 线性布局中常见的冲突属性总结
android
恋猫de小郭2 小时前
为什么跨平台框架可以适配鸿蒙,它们的技术原理是什么?
android·前端·flutter
whoarethenext2 小时前
C++ OpenCV 学习路线图
c++·opencv·学习
恰薯条的屑海鸥2 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十四期-XXE模块)
网络·学习·安全·web安全·渗透测试