在Android平台上实现人脸识别技术,通常需要使用Google的ML Kit库,以下是一个简单的示例代码,展示如何在Android应用中实现人脸识别功能。
准备工作
确保你已经在build.gradle文件中添加了必要的依赖项:
dependencies {
implementation 'com.google.mlkit:face-detection:16.0.2'
}
权限配置
在AndroidManifest.xml文件中添加相机权限:
<uses-permission android:name="android.permission.CAMERA"/>
布局文件
创建一个简单的布局文件activity_main.xml,包含一个用于显示摄像头预览的SurfaceView和一个按钮来启动人脸识别:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/btnStartFaceDetection"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Face Detection"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="16dp"/>
</RelativeLayout>
MainActivity代码
在MainActivity.java中编写代码以初始化相机并处理人脸识别:
package com.example.facedetection;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.google.mlkit.vision.camera.CameraSource;
import com.google.mlkit.vision.common.InputImage;
import com.google.mlkit.vision.face.Face;
import com.google.mlkit.vision.face.FaceDetector;
import com.google.mlkit.vision.face.FaceDetectorOptions;
import java.io.IOException;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final int CAMERA_PERMISSION_CODE = 100;
private SurfaceView surfaceView;
private CameraSource cameraSource;
private FaceDetector faceDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = findViewById(R.id.surfaceView);
Button btnStartFaceDetection = findViewById(R.id.btnStartFaceDetection);
// Check for camera permissions
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_CODE);
} else {
startCamera();
}
btnStartFaceDetection.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
detectFaces();
}
});
}
private void startCamera() {
FaceDetectorOptions options = new FaceDetectorOptions.Builder()
.setPerformanceMode(FaceDetectorOptions.PERFORMANCE_MODE_FAST)
.setLandmarkMode(FaceDetectorOptions.LANDMARK_MODE_NONE)
.setClassificationMode(FaceDetectorOptions.CLASSIFICATION_MODE_NONE)
.build();
faceDetector = FaceDetection.getClient(options);
cameraSource = new CameraSource.Builder(this, faceDetector)
.setFacing(CameraSource.CAMERA_FACING_FRONT) // Use front camera for better detection in portrait mode
.setRequestedPreviewSize(1280, 720)
.setAutoFocusEnabled(true)
.build();
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
try {
cameraSource.start(holder);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
cameraSource.stop();
}
});
}
private void detectFaces() {
if (cameraSource != null) {
cameraSource.takePicture(new CameraSource.ShutterCallback() {
@Override
public void onShutter() {}
}, new CameraSource.PictureCallback() {
@Override
public void onPictureTaken(byte[] bytes) {
InputImage image = InputImage.fromByteArray(bytes, 90); // Rotate the image to correct orientation
faceDetector.process(image)
.addOnSuccessListener(faces -> {
for (Face face : faces) {
Log.d(TAG, "Face detected!");
}
})
.addOnFailureListener(e -> Log.e(TAG, "Face detection failed!", e));
}
});
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CAMERA_PERMISSION_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startCamera();
} else {
Log.e(TAG, "Camera permission denied");
}
}
}
}
运行应用
现在你可以运行你的应用,点击“Start Face Detection”按钮,应用将开始检测人脸并在日志中输出检测结果,如果检测到人脸,会在控制台打印“Face detected!”。
通过以上步骤,你可以在Android应用中实现基本的人脸识别功能,这个示例使用了Google ML Kit库,可以快速集成并使用强大的机器学习模型进行人脸检测,根据实际需求,你可以进一步扩展和优化这个示例,例如增加更多的UI元素、处理不同的设备方向、或者结合其他功能如表情识别等。
以上内容就是解答有关“android实现人脸识别技术的示例代码”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...