以下是一个简单的安卓项目示例,通过NDK调用OpenCV来处理图像(例如,将彩色图像转换为灰度图像)。
开发环境
- 安装 Android Studio(支持NDK开发)。
- 配置NDK和CMake(通过Android Studio的SDK Manager)。
- 下载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. 运行项目
- 将一张彩色图片(如
input.jpg
)放在设备的/sdcard
目录下。 - 运行项目,可以看到图片被转换为灰度。
扩展功能
- 添加更多OpenCV图像处理功能,如边缘检测、模糊处理等。
- 实现视频实时处理功能,使用
CameraX
和 OpenCV 相结合。