package test.com.getbright;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.graphics.PointF;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.media.FaceDetector;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import java.io.IOException;
import java.util.List;
/**
* Created by yubo on 2015/9/20.
*/
public class CameraView extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback {
private Context context;
private Camera camera;
private FaceView faceView;
private OnFaceDetectedListener onFaceDetectedListener;
/**
* 摄像头最大的预览尺寸
*/
private Size maxPreviewSize;
/**
* 预览时Frame的计数器
*/
private int frameCount;
/**
* 是否正在检测人脸
*/
private boolean isDetectingFace = false;
/**
* 是否已检测到人脸
*/
private boolean detectedFace = false;
public CameraView(Context context) {
super(context);
init(context);
}
public CameraView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
this.context = context;
getHolder().addCallback(this);
}
public void setFaceView(FaceView faceView) {
if (faceView != null) {
this.faceView = faceView;
}
}
/** 摄像头重新开始预览 */
public void reset() {
if(faceView != null) {
faceView.setVisibility(View.GONE);
}
if(camera != null) {
camera.setPreviewCallback(this);
camera.startPreview();
}
frameCount = 0;
detectedFace = false;
isDetectingFace = false;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
if(camera != null) {
camera.setDisplayOrientation(90);
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(this);
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (camera != null) {
maxPreviewSize = getMaxPreviewSize(camera);
if (maxPreviewSize != null) {
ViewGroup.LayoutParams params = getLayoutParams();
Point point = getScreenSize();
params.width = point.x;
params.height = maxPreviewSize.width * point.x / maxPreviewSize.height;
setLayoutParams(params);
if(faceView != null) {
faceView.setLayoutParams(params);
}
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(maxPreviewSize.width, maxPreviewSize.height);
camera.setParameters(parameters);
}
camera.startPreview();
frameCount = 0;
detectedFace = false;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
try {
camera.stopPreview();
camera.setPreviewDisplay(null);
camera.setPreviewCallback(null);
camera.release();
camera = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 获取手机屏幕的尺寸
*
* @return
*/
private Point getScreenSize() {
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
return new Point(outMetrics.widthPixels, outMetrics.heightPixels);
}
/**
* 获取摄像头最大的预览尺寸
*
* @param camera
* @return
*/
private Size getMaxPreviewSize(Camera camera) {
List<Size> list = camera.getParameters().getSupportedPreviewSizes();
if (list != null) {
int max = 0;
Size maxSize = null;
for (Size size : list) {
int n = size.width * size.height;
if (n > max) {
max = n;
maxSize = size;
}
}
return maxSize;
}
return null;
}
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Log.e("yubo", "onPreviewFrame...");
frameCount++;
//前面15帧丢弃
if (frameCount > 15 && !isDetectingFace && !detectedFace) {
Size size = camera.getParameters().getPreviewSize();
final byte[] byteArray = ImageUtils.yuv2Jpeg(data, size.width, size.height);
isDetectingFace = true;
new Thread() {
@Override
public void run() {
detectFaces(byteArray);
}
}.start();
}
}
/**
* 检测data数据中是否有人脸,这里需要先旋转一下图片,该方法执行在子线程中
*
* @param data
*/
private void detectFaces(byte[] data) {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
bitmap = ImageUtils.rotateBitmap(bitmap, -90);
bitmap = bitmap.copy(Bitmap.Config.RGB_565, true);
FaceDetectorUtils.detectFace(bitmap, new FaceDetectorUtils.Callback() {
@Override
public void onFaceDetected(final FaceDetector.Face[] faces, final Bitmap bm) {
isDetectingFace = false;
Log.e("yubo", "face detected...");
if (!detectedFace) {
detectedFace = true;
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
if (camera != null) {
camera.stopPreview();
}
if (faceView != null) {
float scaleRate = bm.getWidth() * 1.0f / getScreenSize().x;
faceView.setScaleRate(scaleRate);
faceView.setFaces(faces, bm);
faceView.setVisibility(View.VISIBLE);
}
if (onFaceDetectedListener != null) {
onFaceDetectedListener.onFaceDetected(bm);
}
}
});
}
}
@Override
public void onFaceNotDetected(Bitmap bm) {
bm.recycle();
if (faceView != null) {
faceView.clear();
}
isDetectingFace = false;
}
});
}
/**
* 检测到人脸的监听器
*/
public interface OnFaceDetectedListener {
void onFaceDetected(Bitmap bm);
}
/**
* 设置监听器,监听检测到人脸的动作
*/
public void setOnFaceDet
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
GetBright.zip (53个子文件)
GetBright
GetBright.iml 940B
gradlew 5KB
settings.gradle 16B
.idea
libraries
appcompat_v7_23_1_1.xml 775B
support_annotations_23_1_1.xml 523B
support_v4_23_1_1.xml 917B
runConfigurations.xml 564B
misc.xml 2KB
compiler.xml 686B
workspace.xml 153KB
gradle.xml 880B
.name 9B
encodings.xml 159B
modules.xml 355B
copyright
profiles_settings.xml 76B
build
intermediates
dex-cache
cache.xml 64B
gradle
wrapper
gradle-wrapper.properties 230B
gradle-wrapper.jar 52KB
.gradle
2.8
taskArtifacts
cache.properties.lock 17B
fileHashes.bin 129KB
outputFileStates.bin 20KB
taskArtifacts.bin 78KB
fileSnapshots.bin 1.89MB
cache.properties 31B
local.properties 443B
gradlew.bat 2KB
gradle.properties 872B
.gitignore 105B
app
src
androidTest
java
test
com
getbright
ApplicationTest.java 361B
test
java
test
com
getbright
ExampleUnitTest.java 325B
main
AndroidManifest.xml 877B
res
mipmap-hdpi
ic_launcher.png 3KB
mipmap-xxxhdpi
ic_launcher.png 10KB
mipmap-xhdpi
ic_launcher.png 5KB
mipmap-mdpi
ic_launcher.png 2KB
drawable
layout
pop_win_layout.xml 770B
activity_main.xml 742B
values-w820dp
dimens.xml 364B
values
colors.xml 1KB
strings.xml 75B
styles.xml 69B
dimens.xml 216B
mipmap-xxhdpi
ic_launcher.png 8KB
java
test
com
getbright
ImageUtils.java 2KB
FaceDetectorUtils.java 1KB
FaceView.java 4KB
MainActivity.java 5KB
CameraView.java 8KB
libs
app.iml 7KB
.gitignore 8B
build.gradle 645B
proguard-rules.pro 676B
build.gradle 528B
共 53 条
- 1
yubo_725
- 粉丝: 1133
- 资源: 46
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 财政学知识点归纳 & 复习题及答案
- 2023-04-06-项目笔记 - 第一百二十八阶段 - 4.4.2.126全局变量的作用域-126 -2024.05.09
- Excel表格筛选工具
- liang新版nacos本地使用方法.zip
- 基于JSP毕业设计-网络购物中心毕业设计(源代码+论文).zip
- 直流电机电磁计算软件Excel版.xlsx
- 1694jsp宿舍管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目源码
- 基于JSP毕业设计-数据库连接池的研究与实现(源代码+论文).zip
- Arduino IDE 2.3.2 windows 64位版本
- zookeeper的设计与使用(集群部署,dubbo,分布式锁,master选举,负载均衡,watch,权限等)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页