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(); } }