如何在 Android 專案中應用 OpenCV?

Lockegogo發表於2024-07-17

如何在 Android 專案中應用 OpenCV?

流程總覽

  1. 匯入 OpenCV 庫
  2. 在 Android 專案中配置 OpenCV
  3. 建立人臉識別器
  4. 識別並裁剪人臉區域
  5. 顯示裁剪後的人臉圖片

具體實現

匯入 OpenCV 庫

  1. 先去 OpenCV 官網下載 OpenCV 的 Android 庫並解壓:https://opencv.org/releases/
  2. 在專案中點選 file->new->Import Module,選擇解壓後的 opencv-android-sdk 資料夾中的 sdk 資料夾,並將 Module name 的名字修改為 lib_opencv
  3. 修改 build.gradle(Module:lib_opencv)sdk 版本和 build.gradle(Module:app) 保持一致

img

  1. build.gradle(Project:project-name) 中增加如下程式碼:
 buildscript {
    # add
    ext.kotlin_version = '1.5.20'

    repositories { ... }

    dependencies {
    ...
    # add
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}
  1. settings.gradle 中增加一行:include ':lib_opencv'
  2. 應用 OpenCV 庫到 APP 中:點選 file->project structure->Dependencies->app->3 Module Dependency,然後給 opencv 打上對勾,應用即可,表現在 build.gradle(Module:app) 中:
dependencies {
    ...
    implementation project(path: ':lib_opencv')
    ...
}
  1. 在 Android 專案的 AndroidManifest.xml檔案中新增如下許可權:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
  1. 在 MainActivity 類中,新增如下程式碼來載入 OpenCV 庫
static {
    System.loadLibrary("opencv_java4");
}
  1. 可選步驟:將 lib_opencv/etc/haarcascade/haarcascade_frontalface_default.xml 檔案複製到 app/src/main/assets/ 資料夾下,方便呼叫

建立人臉識別器

public class FaceDetector {
    private final String TAG = "FaceUtils";
    private String xmlPath = "haarcascade_frontalface_default.xml";
    CascadeClassifier faceDetector;

    static {
        System.loadLibrary("opencv_java4");
    }

    public FaceDetector(String dataPath) {
        String xmlFilePath = dataPath + xmlPath;
        // 建立人臉檢測器
        faceDetector = new CascadeClassifier(xmlFilePath);
    }

識別並裁剪人臉

在這一步中,我們將載入影像並使用人臉識別器進行人臉檢測:

public Bitmap detectAndCropFace(Bitmap originalBitmap) {
    // 將 Bitmap 轉換為 Mat
    Mat mat = new Mat();
    Utils.bitmapToMat(originalBitmap, mat);

    // 建立一個灰度 Mat
    Mat grayMat = new Mat();
    Imgproc.cvtColor(mat, grayMat, Imgproc.COLOR_BGR2GRAY);

    // 檢測人臉
    MatOfRect faces = new MatOfRect();
    faceDetector.detectMultiScale(grayMat, faces);

    // 獲取第一個檢測到的人臉的邊界框
    Rect[] facesArray = faces.toArray();
    if (facesArray.length > 0) {
        Rect faceRect = facesArray[0];
        // 擴大邊界框:數值可調整
        int padding = 20;
        faceRect.y = Math.max(faceRect.y - padding, 0);
        faceRect.height = Math.min(faceRect.height + 2 * padding, mat.rows() - faceRect.y);

        // 裁剪人臉
        Mat faceMat = new Mat(mat, faceRect);

        // 將 Mat 轉換為 Bitmap
        Bitmap faceBitmap = Bitmap.createBitmap(faceMat.cols(), faceMat.rows(), Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(faceMat, faceBitmap);

        return faceBitmap;
    } else {
        return null;
    }

}

顯示裁剪後的人臉圖片

private void showFace(Bitmap faceBitmap) {
    ImageView faceImageView = findViewById(R.id.faceImageView);
    faceImageView.setImageBitmap(faceBitmap);
}

runOnUiThread(() -> showFace(faceBitmap));

參考資料

  1. Android Studio 配置 OpenCV 庫
  2. android opencv 識別人臉並裁剪

相關文章