如何在 Android 專案中應用 OpenCV?
流程總覽
- 匯入 OpenCV 庫
- 在 Android 專案中配置 OpenCV
- 建立人臉識別器
- 識別並裁剪人臉區域
- 顯示裁剪後的人臉圖片
具體實現
匯入 OpenCV 庫
- 先去 OpenCV 官網下載 OpenCV 的 Android 庫並解壓:https://opencv.org/releases/
- 在專案中點選
file->new->Import Module
,選擇解壓後的opencv-android-sdk
資料夾中的sdk
資料夾,並將 Module name 的名字修改為lib_opencv
- 修改
build.gradle(Module:lib_opencv)
的sdk
版本和build.gradle(Module:app)
保持一致
- 在
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"
}
- 在
settings.gradle
中增加一行:include ':lib_opencv'
- 應用 OpenCV 庫到 APP 中:點選
file->project structure->Dependencies->app->3 Module Dependency
,然後給 opencv 打上對勾,應用即可,表現在build.gradle(Module:app)
中:
dependencies {
...
implementation project(path: ':lib_opencv')
...
}
- 在 Android 專案的
AndroidManifest.xml
檔案中新增如下許可權:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
- 在 MainActivity 類中,新增如下程式碼來載入 OpenCV 庫
static {
System.loadLibrary("opencv_java4");
}
- 可選步驟:將
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));
參考資料
- Android Studio 配置 OpenCV 庫
- android opencv 識別人臉並裁剪