摄像头捕捉头部动作
来源:互联网 发布:单片机实验箱 编辑:程序博客网 时间:2024/06/10 21:53
CameraGameActivity摄像头捕捉头部动作及脸部识别
public class CameraGameActivity extends Activity
{
/** Called when the activity is first created. */
TextView textView;
Bitmap face;
MyImage imageView;
int count;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
Bitmap image = null;
// 定义系统所用的照相机
Camera camera;
// 是否在浏览中
boolean isPreview = false;
// 人脸识别
FaceDetector faceDetector = null;
FaceDetector.Face[] faces = null;
PointF minPointF = new PointF();
float[] x = null;
float[] y = null;
PreviewCallback previewCallback = new PreviewCallback()
{
@Override
public void onPreviewFrame(byte[] data, Camera camera)
{
// 传递进来的data,默认是YUV420SP的
if (data != null)
{
Camera.Parameters parameters = camera.getParameters();
int imageFormat = parameters.getPreviewFormat();
// Log.i("map", "Image Format: " + imageFormat);
if (imageFormat == ImageFormat.NV21)
{
// get full picture
int w = parameters.getPreviewSize().width;
int h = parameters.getPreviewSize().height;
Rect rect = new Rect(0, 0, w, h);
YuvImage img = new YuvImage(data, ImageFormat.NV21, w, h, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (img.compressToJpeg(rect, 100, baos))
{
image = BitmapFactory.decodeByteArray(baos.toByteArray(), 0, baos.size());
// saveBitmap2file(image,"face.jpg");
face = image.copy(Config.RGB_565, true);
image.recycle();
setFace(face);
}
}
}
}
};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.textView1);
imageView = (MyImage) findViewById(R.id.imageView1);
// 获取界面中SurfaceView组件
surfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
// 获取surfaceView中的SurfaceHolder
surfaceHolder = surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceHolder.addCallback(new Callback()
{
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
// TODO Auto-generated method stub
}
public void surfaceCreated(SurfaceHolder holder)
{
// TODO Auto-generated method stub
initCamera();
setSurfaceViewSize();
initFaceDetector();
}
public void surfaceDestroyed(SurfaceHolder holder)
{
// TODO Auto-generated method stub
// 如果camera不为null,释放摄像头
if (camera != null)
{
if (isPreview)
{
camera.setPreviewCallback(null);
camera.stopPreview();
}
isPreview = false;
camera.release();
camera = null;
}
}
});
}
private void initCamera()
{
if (camera == null && !isPreview)
{
camera = Camera.open();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(i, info);
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {//这就是前置摄像头,亲。
camera = Camera.open(i);
}
}
}
// 打开照相机
// if (Camera.getNumberOfCameras() > 1)
// {
//前置摄像头
// camera = Camera.open(1);
// }
// else
// {
// camera = Camera.open();
// }
camera.setPreviewCallback(previewCallback);
}
if (camera != null && !isPreview)
{
try
{
Camera.Parameters parameters = camera.getParameters();
List<Size> sizes = parameters.getSupportedPreviewSizes();
int height = 10000;
int width = 10000;
for (Size size : sizes)
{
if (height > size.height)
{
height = size.height;
width = size.width;
}
}
// 设置照片预览的大小
parameters.setPreviewSize(width, height);
// 每秒显示8帧
parameters.setPreviewFrameRate(8);
// 设置图片格式
parameters.setPictureFormat(PixelFormat.JPEG);
// 设置JPEG照片的质量
parameters.set("jpeg-quality", 85);
// 设置照片的大小
// parmeters.setPictureSize(WIDTH, HEIGHT);
camera.setParameters(parameters);
// 通过surfaceView来显示取景画面
camera.setPreviewDisplay(surfaceHolder);
// 开始预览
camera.startPreview();
isPreview = true;
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void setSurfaceViewSize()
{
LayoutParams layoutParams = surfaceView.getLayoutParams();
layoutParams.height = camera.getParameters().getPreviewSize().height;
layoutParams.width = camera.getParameters().getPreviewSize().width;
surfaceView.setLayoutParams(layoutParams);
imageView.setLayoutParams(layoutParams);
}
public void initFaceDetector()
{
faceDetector = new FaceDetector(camera.getParameters().getPreviewSize().width,
camera.getParameters().getPreviewSize().height, 10);
faces = new FaceDetector.Face[10];
}
public void setFace(Bitmap bitmap)
{
Long time = System.currentTimeMillis();
count = faceDetector.findFaces(bitmap, faces);
Log.d("gc", "-----------count : " + count);
x = new float[count];
y = new float[count];
if (count > 0)
{
faces[0].getMidPoint(minPointF);
x[0] = minPointF.x;
y[0] = minPointF.y;
imageView.setPoint(x[0], y[0]);
textView.setText(getResources().getString(R.string.help) + " x = " + x[0] + " y = " + y[0]);
textView.invalidate();
}
Log.d("gc", "time--------------" + (System.currentTimeMillis() - time));
imageView.invalidate();
}
static boolean saveBitmap2file(Bitmap bmp, String filename)
{
CompressFormat format = Bitmap.CompressFormat.JPEG;
int quality = 100;
OutputStream stream = null;
try
{
File file = new File(Environment.getExternalStorageDirectory() + "/" + filename);
if (!file.exists())
{
file.createNewFile();
}
stream = new FileOutputStream(Environment.getExternalStorageDirectory() + "/" + filename);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return bmp.compress(format, quality, stream);
}
}
脸部周围画框
public class MyImage extends ImageView
{
Paint paint;
float x ;
float y ;
public MyImage(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
}
public MyImage(Context context, AttributeSet attrs)
{
super(context, attrs);
init();
}
public MyImage(Context context)
{
super(context);
init();
}
public void init()
{
paint = new Paint();
paint.setStrokeWidth(3);//线条粗细
paint.setColor(Color.BLUE);
paint.setStyle(Style.STROKE);
}
public void setPoint(float x, float y)
{
this.x = getWidth() - x;
this.y = y;
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
if(x!= 0 && y != 0)
{
canvas.drawRect(x-30, y-30, x+30, y+30, paint);
}
}
}
- 摄像头捕捉头部动作
- opencv 通过摄像头捕捉头部
- 动作捕捉
- GESTURETEK(动作捕捉)
- kinect动作捕捉
- VC++ 捕捉摄像头视频!
- jWebCam摄像头捕捉应用
- 摄像头捕捉程序 VC
- opencv捕捉摄像头
- 关于BVH 动作捕捉数据文件
- Kinect动作捕捉的改进
- 惯性动作捕捉之工业设计
- 全身动作捕捉套装MIISUIT
- VC++_捕捉摄像头视频
- 摄像头视频捕捉(IsampleGrabberCB实现)
- OpenCV之摄像头捕捉图像
- 捕捉摄像头并保存视频
- 摄像头视频捕捉(IsampleGrabberCB实现)
- Android游戏开发:游戏框架的搭建(2)
- Android系统属性
- fedora16英文环境下支持中文输入法
- CKEditor和CKFinder的使用说明
- WINCE5重新安装
- 摄像头捕捉头部动作
- Android游戏开发:游戏框架的搭建(1)
- Android 4.0新特性(中文)
- XCode 上传应用程序到App Store出现图标报错问题的解决办法
- 一些名词解释
- 学校yii——关于Params
- 基于像素的皮肤检测技术
- java学习书籍推荐
- struts2配置freemarker ,以及struts2访问后缀配置。