UvcCamera:
https://xie.infoq.cn/article/7e6a906f7096bb8e743ec2fc1
OpenCV
https://blog.youkuaiyun.com/switch_love_case/article/details/104137311
public class UserFaceActivity extends BaseActivity implements CameraDialog.CameraDialogParent {
private static final String TAG = "UserFaceActivity";
private final Object mSync = new Object();
// for accessing USB and USB camera
private USBMonitor mUSBMonitor;
private UVCCamera mUVCCamera;
private SurfaceView surfaceView;
private Surface mPreviewSurface;
private boolean isActive, isPreview, isTakePhoto;
View photoView;
private CascadeClassifier classifier;
Mat mFrameChain = new Mat(UVCCamera.DEFAULT_PREVIEW_HEIGHT + UVCCamera.DEFAULT_PREVIEW_HEIGHT/2 , UVCCamera.DEFAULT_PREVIEW_WIDTH, CvType.CV_8UC1);
private int mAbsoluteFaceSize = 200;
String code;
String cur;
// 手动装载openCV库文件,以保证手机无需安装OpenCV Manager 不加这里将导致无法初始化 级联分类器(开机闪退)
static {
System.loadLibrary("opencv_java3");
}
boolean isFinish;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_face);
surfaceView = findViewById(R.id.user_face_surface_view);
mPreviewSurface = surfaceView.getHolder().getSurface();
code = getIntent().getStringExtra("code");
((TextView)findViewById(R.id.face_code)).setText(code);
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(final SurfaceHolder holder) {
Log.v(TAG, "surfaceCreated:");
}
@Override
public void surfaceChanged(final SurfaceHolder holder, final int format, final int width, final int height) {
if ((width == 0) || (height == 0)) return;
Log.v(TAG, "surfaceChanged:");
mPreviewSurface = holder.getSurface();
synchronized (mSync) {
if (isActive && !isPreview && (mUVCCamera != null)) {
mUVCCamera.setPreviewDisplay(mPreviewSurface);
mUVCCamera.startPreview();
isPreview = true;
}
}
}
@Override
public void surfaceDestroyed(final SurfaceHolder holder) {
Log.v(TAG, "surfaceDestroyed:");
synchronized (mSync) {
if (mUVCCamera != null) {
mUVCCamera.stopPreview();
}
isPreview = false;
if(mPreviewSurface!=null) {
mPreviewSurface.release();
mPreviewSurface = null;
}
}
}
});
mUSBMonitor = new USBMonitor(this, mOnDeviceConnectListener);
initClassifier();
findViewById(R.id.back).setOnClickListener(v -> {
synchronized (mSync){
if(isFinish) return;
isFinish = true;
isActive = isPreview = false;
}
new Thread(() -> {
try {
Thread.sleep(1000);
finish();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
});
findViewById(R.id.take_photo).setOnClickListener(v -> {
isTakePhoto = true;
});
photoView = findViewById(R.id.face_photo);
initFaceList();
findViewById(R.id.delete_photo)