我是靠谱客的博主 神勇微笑,这篇文章主要介绍Android 一分钟了解简单原生FaceDetector人脸识别,解决SurfaceView+MediaRecorder录制视频不清晰,现在分享给大家,希望可以做个参考。

近来,发现登入后台管理系统,发现上传上来的认证视频太模糊了,于是乎,发现没有给MediaRecorder设置帧频率。

复制代码
1
2
// 设置帧频率,录制视频会更加清晰 mRecorder.setVideoEncodingBitRate(5*1024*1024);

1.直接开撸,先打开相机,来获取想要的bitmap,关于为什么用到YuvImage:https://blog.csdn.net/illidantao/article/details/51366047

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
try { camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); } catch (Exception e) { e.printStackTrace(); } try { camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); } catch (Exception e) { e.printStackTrace(); } } camera.setDisplayOrientation(90); camera.startPreview(); } camera.setPreviewCallback(new Camera.PreviewCallback() { @Override public void onPreviewFrame(final byte[] data, Camera camera) { Camera.Size size = camera.getParameters().getPreviewSize(); YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null); if (image != null) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream); Bitmap bmp = BitmapFactory.decodeByteArray( stream.toByteArray(), 0, stream.size()); Matrix matrix = new Matrix(); matrix.reset(); matrix.setRotate(-90); bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); Bitmap bitmap = bmp.copy(Bitmap.Config.RGB_565, true); findFace(bitmap); try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } } });

安卓原生SDK中有个FaceDetector类,传入一个Bitmap 格式的数据;B,只能识别双眼距离大于20 像素的人脸像(当然,这个可在framework层中修改);C,只能检测出人脸的位置(双眼的中心点及距离),不能对人脸进行匹配(查找指定的脸谱)。下面的坐标实现具体的获取人脸的中心点坐标,通过FaceDetector.Face[1]传入要抓取的个数,如果想抓去多个的话Face[*]就可以了,findFaces(bitmap,face)得到一个int值,如果其大于1则代表成功那么就开始接下来的操作了。 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
public void findFace(Bitmap bitmap) { FaceDetector faceDetector = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), 1); FaceDetector.Face[] face = new FaceDetector.Face[1]; int faces = faceDetector.findFaces(bitmap, face); if (faces > 0) { camera.stopPreview(); preview = false; camera.setPreviewCallback(null); camera.release(); initMediaRecorder(); } }

 2.当获取验证成功以后,实现6秒录制视频。

复制代码
1
2
3
4
5
6
7
8
9
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFormat(PixelFormat.TRANSLUCENT); setContentView(R.layout.activity_uservideo); surfaceview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceview.getHolder().setFixedSize(200, 200); surfaceview.getHolder().addCallback(new SurfaceViewCallback()); }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public void initMediaRecorder() { if (mRecorder == null) { mRecorder = new MediaRecorder(); // Create MediaRecorder } try { initCamera(); // 这两项需要放在setOutputFormat之前 mRecorder.setCamera(videocamera); mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // Set output file format mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 这两项需要放在setOutputFormat之后 mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); // mRecorder.setOrientationHint(90); // mRecorder.setVideoSize(320, 240); CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_1080P); mRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight); // 设置帧频率,录制视频会更加清晰 mRecorder.setVideoEncodingBitRate(5*1024*1024); // mRecorder.setVideoFrameRate(20); mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); file = Constants.FOLDER_PHOTO + System.currentTimeMillis() + ".mp4"; mRecorder.setOutputFile(file); mRecorder.prepare(); mRecorder.start(); // Recording is now started setCountBack(); } catch (IOException e1) { e1.printStackTrace(); } }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void initCamera() { Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); cameraCount = Camera.getNumberOfCameras(); // get cameras number for (int camIdx = 0; camIdx < cameraCount; camIdx++) { Camera.getCameraInfo(camIdx, cameraInfo); // get camerainfo if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { // 代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置 try { videocamera = Camera.open(camIdx); videocamera.setDisplayOrientation(90); videocamera.cancelAutoFocus(); } catch (RuntimeException e) { e.printStackTrace(); } } } videocamera.unlock(); }

 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void setCountBack() { timeCount = 5; timetext.setText(timeCount + "秒"); handler.postDelayed(new Runnable() { @Override public void run() { if (timeCount > 0) { timetext.setText(--timeCount + "秒"); handler.postDelayed(this, 1000); return; } timetext.setText(""); if (mRecorder == null) { return; } try { mRecorder.stop(); //上传视频 uploadVideo(); } catch (Exception e) { ToastUtil.showToast(AuthRecordingVideoActivity.this, getString(R.string.error_recoder)); } } }, 1000); }

关于SurfaceView预览Camera拉伸问题:https://blog.csdn.net/illidantao/article/details/51366047

最后

以上就是神勇微笑最近收集整理的关于Android 一分钟了解简单原生FaceDetector人脸识别,解决SurfaceView+MediaRecorder录制视频不清晰的全部内容,更多相关Android内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(95)

评论列表共有 0 条评论

立即
投稿
返回
顶部