package com.example.settinglibrary;
|
|
import android.app.Activity;
|
import android.content.Intent;
|
import android.graphics.Color;
|
import android.hardware.Camera;
|
import android.os.Bundle;
|
import android.view.TextureView;
|
import android.view.View;
|
import android.view.ViewGroup;
|
import android.widget.ImageView;
|
import android.widget.TextView;
|
|
import com.baidu.idl.main.facesdk.model.BDFaceImageInstance;
|
import com.baidu.idl.main.facesdk.model.BDFaceSDKCommon;
|
import com.example.datalibrary.activity.BaseActivity;
|
import com.example.datalibrary.gatecamera.AutoTexturePreviewView;
|
import com.example.datalibrary.gatecamera.CameraPreviewManager;
|
import com.example.datalibrary.utils.BitmapUtils;
|
import com.example.datalibrary.view.PreviewTexture;
|
|
|
/**
|
* author : shangrog
|
* date : 2019/5/27 6:37 PM
|
* description :人脸检测角度设置
|
*/
|
public class FaceDetectAngleActivity extends BaseActivity {
|
private static final int PREFER_WIDTH = 640;
|
private static final int PREFER_HEIGHT = 480;
|
// RGB+IR 控件
|
private PreviewTexture[] mPreview;
|
private Camera[] mCamera;
|
|
private AutoTexturePreviewView rgbFaceView;
|
private View rgbRotate;
|
private ImageView rgbRotateImg;
|
private View rgbMirror;
|
private TextView rgbMirrorTx;
|
private ImageView rgbMirrorImg;
|
private ImageView rgbImageView;
|
private View rgbGroup;
|
private View rgbFaceGroup;
|
|
private AutoTexturePreviewView nirFaceView;
|
private View nirRotate;
|
private ImageView nirRotateImg;
|
private View nirMirror;
|
private TextView nirMirrorTx;
|
private ImageView nirMirrorImg;
|
private View nirFaceGroup;
|
private View nirGroup;
|
private ImageView nirImageView;
|
int rgbDetectDirection;
|
int mirrorDetectRGB;
|
int nirDetectDirection;
|
int mirrorDetectNIR;
|
// 摄像头个数
|
private int mCameraNum;
|
private int rbgCameraId = -1;
|
int rgbVideoDirection;
|
int mirrorRGB;
|
int nirVideoDirection;
|
int mirrorNIR;
|
@Override
|
protected void onCreate(Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
setContentView(R.layout.activity_gate_facedetectangle);
|
initMode();
|
}
|
|
@Override
|
protected void onResume() {
|
super.onResume();
|
init();
|
}
|
|
private void initMode(){
|
// 获取Intent对象
|
Intent intent = getIntent();
|
rgbDetectDirection = intent.getIntExtra("rgbDetectDirection" , 0);
|
mirrorDetectRGB = intent.getIntExtra("mirrorDetectRGB" , 0);
|
nirDetectDirection = intent.getIntExtra("nirDetectDirection" , 0);
|
mirrorDetectNIR = intent.getIntExtra("mirrorDetectNIR" , 0);
|
// 获取传递的值
|
rgbVideoDirection = intent.getIntExtra("rgbVideoDirection" , 0);
|
mirrorRGB = intent.getIntExtra("mirrorRGB" , 0);
|
nirVideoDirection = intent.getIntExtra("nirVideoDirection" , 0);
|
mirrorNIR = intent.getIntExtra("mirrorNIR" , 0);
|
rbgCameraId = intent.getIntExtra("rbgCameraId" , -1);
|
// rgb view
|
rgbFaceView = findViewById(R.id.rbg_face_view);
|
rgbRotate = findViewById(R.id.rgb_rotate);
|
rgbRotateImg = findViewById(R.id.rgb_rotate_image);
|
rgbMirror = findViewById(R.id.rgb_mirror);
|
rgbMirrorTx = findViewById(R.id.rgb_mirror_tx);
|
rgbMirrorImg = findViewById(R.id.rgb_mirror_image);
|
rgbImageView = findViewById(R.id.rbg_image_view);
|
rgbGroup = findViewById(R.id.rgb_group);
|
rgbFaceGroup = findViewById(R.id.rbg_face_group);
|
// nir view
|
nirFaceView = findViewById(R.id.nir_face_view);
|
nirRotate = findViewById(R.id.nir_rotate);
|
nirRotateImg = findViewById(R.id.nir_rotate_image);
|
nirMirror = findViewById(R.id.nir_mirror);
|
nirMirrorTx = findViewById(R.id.nir_mirror_tx);
|
nirMirrorImg = findViewById(R.id.nir_mirror_image);
|
nirFaceGroup = findViewById(R.id.nir_face_group);
|
nirGroup = findViewById(R.id.nir_group);
|
nirImageView = findViewById(R.id.nir_image_view);
|
}
|
private void init(){
|
try {
|
mCameraNum = Camera.getNumberOfCameras();
|
mPreview = new PreviewTexture[mCameraNum];
|
mCamera = new Camera[mCameraNum];
|
// 打开摄像头
|
if (mCameraNum < 2) {
|
setNirView(0.3f , View.GONE , R.mipmap.texture_default);
|
openCan(0, 0, rgbFaceView.textureView, new Camera.PreviewCallback() {
|
@Override
|
public void onPreviewFrame(byte[] data, Camera camera) {
|
BDFaceImageInstance rgbInstance = new BDFaceImageInstance(data, PREFER_HEIGHT,
|
PREFER_WIDTH, BDFaceSDKCommon.BDFaceImageType.BDFACE_IMAGE_TYPE_YUV_NV21,
|
rgbDetectDirection,
|
mirrorDetectRGB);
|
showRgbImage(rgbInstance);
|
}
|
});
|
setDisplayOrientation(mCamera[0] , rgbVideoDirection , rgbFaceView);
|
setRotationY(rgbVideoDirection , mirrorRGB , rgbFaceView);
|
setRgbRotate();
|
setRbgMirror();
|
} else {
|
int rbg = CameraPreviewManager.CAMERA_USB;
|
int nir = 1;
|
if (rbgCameraId != -1){
|
rbg = rbgCameraId;
|
nir = Math.abs(rbgCameraId - 1);
|
}
|
setNirView(1 , View.VISIBLE , R.drawable.sr_texture_rectangle);
|
boolean rbgCameraReady = openCan(0, rbg , rgbFaceView.textureView, new Camera.PreviewCallback() {
|
@Override
|
public void onPreviewFrame(byte[] data, Camera camera) {
|
try {
|
BDFaceImageInstance rgbInstance = new BDFaceImageInstance(data, PREFER_HEIGHT,
|
PREFER_WIDTH, BDFaceSDKCommon.BDFaceImageType.BDFACE_IMAGE_TYPE_YUV_NV21,
|
rgbDetectDirection,
|
mirrorDetectRGB);
|
showRgbImage(rgbInstance);
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
});
|
if (rbgCameraReady){
|
setDisplayOrientation(mCamera[0] , rgbVideoDirection , rgbFaceView);
|
setRotationY(rgbVideoDirection , mirrorRGB , rgbFaceView);
|
setRgbRotate();
|
setRbgMirror();
|
}else {
|
setRgbView(0.3f , R.mipmap.texture_default);
|
}
|
boolean nirCameraReady = openCan(1, nir , nirFaceView.textureView, new Camera.PreviewCallback() {
|
@Override
|
public void onPreviewFrame(byte[] data, Camera camera) {
|
try {
|
BDFaceImageInstance nirInstance = new BDFaceImageInstance(data, PREFER_HEIGHT,
|
PREFER_WIDTH, BDFaceSDKCommon.BDFaceImageType.BDFACE_IMAGE_TYPE_YUV_NV21,
|
nirDetectDirection,
|
mirrorDetectNIR);
|
showNirImage(nirInstance);
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
});
|
if (nirCameraReady){
|
setDisplayOrientation(mCamera[1] , nirVideoDirection , nirFaceView);
|
setRotationY(nirVideoDirection , mirrorNIR , nirFaceView);
|
setNirRotate();
|
setNirMirror();
|
// nir旋转
|
nirRotate.setOnClickListener(onClickListener);
|
// nir镜像
|
nirMirror.setOnClickListener(onClickListener);
|
}else {
|
setNirView(0.3f , View.GONE , R.mipmap.texture_default);
|
}
|
}
|
// RGB旋转
|
rgbRotate.setOnClickListener(onClickListener);
|
// rgb镜像
|
rgbMirror.setOnClickListener(onClickListener);
|
ImageView cdaSave = findViewById(R.id.cda_save);
|
cdaSave.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
finish();
|
}
|
});
|
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
}
|
|
@Override
|
public void finish() {
|
Intent intent = new Intent();
|
intent.putExtra("rgbDetectDirection", rgbDetectDirection);
|
intent.putExtra("mirrorDetectRGB", mirrorDetectRGB);
|
intent.putExtra("nirDetectDirection", nirDetectDirection);
|
intent.putExtra("mirrorDetectNIR", mirrorDetectNIR);
|
|
intent.putExtra("rgbVideoDirection", rgbVideoDirection);
|
intent.putExtra("mirrorRGB", mirrorRGB);
|
intent.putExtra("nirVideoDirection", nirVideoDirection);
|
intent.putExtra("mirrorNIR", mirrorNIR);
|
intent.putExtra("rbgCameraId", rbgCameraId);
|
// 设置返回码和返回携带的数据
|
setResult(Activity.RESULT_OK, intent);
|
super.finish();
|
}
|
|
private void setNirView(float alpha , int visibility , int bgResid){
|
View nirTx = findViewById(R.id.nir_tx);
|
nirGroup.setAlpha(alpha);
|
nirTx.setVisibility(visibility);
|
nirRotateImg.setImageResource(R.mipmap.rotate_0);
|
nirFaceGroup.setBackgroundResource(bgResid);
|
}
|
|
private void setRgbView(float alpha , int bgResid){
|
rgbGroup.setAlpha(alpha);
|
rgbFaceGroup.setBackgroundResource(bgResid);
|
}
|
|
private void showNirImage(final BDFaceImageInstance nirInstance){
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
nirImageView.setImageBitmap(BitmapUtils.getInstaceBmp(nirInstance.getImage()));
|
}
|
});
|
nirInstance.destory();
|
}
|
|
private void showRgbImage(final BDFaceImageInstance rgbInstance){
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
|
rgbImageView.setImageBitmap(BitmapUtils.getInstaceBmp(rgbInstance.getImage()));
|
}
|
});
|
rgbInstance.destory();
|
}
|
|
|
private boolean openCan(int displayIndex, int index, TextureView faceView, Camera.PreviewCallback cb){
|
try {
|
mCamera[displayIndex] = Camera.open(index);
|
mPreview[displayIndex] = new PreviewTexture(this, faceView);
|
mPreview[displayIndex].setCamera(mCamera[displayIndex], PREFER_WIDTH, PREFER_HEIGHT);
|
mCamera[displayIndex].setPreviewCallback(cb);
|
return true;
|
} catch (Exception e) {
|
e.getLocalizedMessage();
|
}
|
return false;
|
}
|
|
View.OnClickListener onClickListener = new View.OnClickListener() {
|
@Override
|
public void onClick(View view) {
|
int id = view.getId();
|
if (id == R.id.rgb_rotate){
|
setVideoDirection(0);
|
setRgbRotate();
|
}else if (id == R.id.rgb_mirror){
|
setMirror(0);
|
setRbgMirror();
|
}else if (id == R.id.nir_rotate){
|
setVideoDirection(1);
|
setNirRotate();
|
}else if (id == R.id.nir_mirror){
|
setMirror(1);
|
setNirMirror();
|
}
|
}
|
};
|
private void setRgbRotate(){
|
if (rgbDetectDirection == 0){
|
rgbRotateImg.setImageResource(R.mipmap.rotate_0);
|
}else if (rgbDetectDirection == 90){
|
rgbRotateImg.setImageResource(R.mipmap.rotate_90);
|
}else if (rgbDetectDirection == 180){
|
rgbRotateImg.setImageResource(R.mipmap.rotate_180);
|
}else if (rgbDetectDirection == 270){
|
rgbRotateImg.setImageResource(R.mipmap.rotate_270);
|
}
|
}
|
|
private void setRbgMirror(){
|
if (mirrorDetectRGB == 0){
|
rgbMirrorImg.setImageResource(R.mipmap.mirror_close);
|
rgbMirrorTx.setTextColor(Color.parseColor("#ffffff"));
|
}else {
|
rgbMirrorImg.setImageResource(R.mipmap.mirror_oppen);
|
rgbMirrorTx.setTextColor(Color.parseColor("#00BAF2"));
|
}
|
}
|
private void setNirMirror(){
|
if (mirrorDetectNIR == 0){
|
nirMirrorImg.setImageResource(R.mipmap.mirror_close);
|
nirMirrorTx.setTextColor(Color.parseColor("#ffffff"));
|
}else {
|
nirMirrorImg.setImageResource(R.mipmap.mirror_oppen);
|
nirMirrorTx.setTextColor(Color.parseColor("#00BAF2"));
|
}
|
}
|
private void setNirRotate(){
|
if (nirDetectDirection == 0){
|
nirRotateImg.setImageResource(R.mipmap.rotate_0);
|
}else if (nirDetectDirection == 90){
|
nirRotateImg.setImageResource(R.mipmap.rotate_90);
|
}else if (nirDetectDirection == 180){
|
nirRotateImg.setImageResource(R.mipmap.rotate_180);
|
}else if (nirDetectDirection == 270){
|
nirRotateImg.setImageResource(R.mipmap.rotate_270);
|
}
|
}
|
// 旋转角度
|
private void setVideoDirection(int index){
|
if (mCamera == null || mCamera[index] == null) {
|
return;
|
}
|
if (index == 0){
|
rgbDetectDirection += 90;
|
if (rgbDetectDirection > 270) {
|
rgbDetectDirection = 0;
|
}
|
}else {
|
nirDetectDirection += 90;
|
if (nirDetectDirection > 270) {
|
nirDetectDirection = 0;
|
}
|
}
|
}
|
public void setDisplayOrientation(Camera camera , int videoDirection , AutoTexturePreviewView mTextureView){
|
camera.setDisplayOrientation(videoDirection);
|
ViewGroup.LayoutParams layoutParams = mTextureView.getLayoutParams();
|
int h = layoutParams.height;
|
int w = layoutParams.width;
|
if (videoDirection == 90 || videoDirection == 270) {
|
if (h > w){
|
|
layoutParams.height = w;
|
layoutParams.width = h;
|
}
|
// 旋转90度或者270,需要调整宽高
|
mTextureView.setPreviewSize(PREFER_HEIGHT, PREFER_WIDTH);
|
} else {
|
if (w > h){
|
|
layoutParams.height = w;
|
layoutParams.width = h;
|
}
|
mTextureView.setPreviewSize(PREFER_WIDTH, PREFER_HEIGHT);
|
}
|
mTextureView.setLayoutParams(layoutParams);
|
}
|
// 旋转角度
|
private void setMirror(int index){
|
if (mCamera == null || mCamera[index] == null) {
|
return;
|
}
|
if (index == 0){
|
mirrorDetectRGB = Math.abs(1 - mirrorDetectRGB);
|
}else {
|
mirrorDetectNIR = Math.abs(1 - mirrorDetectNIR);
|
}
|
}
|
// 镜像
|
public void setRotationY(int videoDirection , int isRgbRevert , AutoTexturePreviewView mTextureView){
|
if (videoDirection == 90 || videoDirection == 270) {
|
if (isRgbRevert == 1) {
|
mTextureView.setRotationY(180);
|
} else {
|
mTextureView.setRotationY(0);
|
}
|
// 旋转90度或者270,需要调整宽高
|
} else {
|
if (isRgbRevert == 1) {
|
mTextureView.setRotationY(180);
|
} else {
|
mTextureView.setRotationY(0);
|
}
|
}
|
}
|
|
@Override
|
protected void onPause() {
|
for (int i = 0; i < mCameraNum; i++) {
|
if (mCamera[i] != null) {
|
mCamera[i].setPreviewCallback(null);
|
mCamera[i].stopPreview();
|
mPreview[i].release();
|
mCamera[i].release();
|
mCamera[i] = null;
|
}
|
}
|
super.onPause();
|
}
|
|
@Override
|
protected void onDestroy() {
|
super.onDestroy();
|
}
|
}
|