Android 在实时摄影机提要的顶部绘制
在我的应用程序中,我只想在一张脸的位置上,在一个实时摄像机的馈送上画一个矩形。我使用下面的代码Android 在实时摄影机提要的顶部绘制,android,android-camera,Android,Android Camera,在我的应用程序中,我只想在一张脸的位置上,在一个实时摄像机的馈送上画一个矩形。我使用下面的代码 @Override public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); try { camera.setPreviewDisplay(holder); camera.setPreviewCallback(new Prev
@Override
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
try {
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[]_data, Camera _camera) {
// TODO Do something with the preview image.
byte data[]=_data;
Bitmap b = BitmapFactory.decodeByteArray(data, 0, data.length);
DrawOnTop mDraw.bitmap=b;
addContentView(mDraw, new LayoutParams
(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
//detecteye(bitmap);
}
});
} catch (IOException e)
{ e.printStackTrace();
}
camera.startPreview();
}
class DrawOnTop extends View {
Bitmap bitmap;
public DrawOnTop(Context context,AttributeSet attrs) {
// TODO Auto-generated constructor stub
super(context,attrs);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
Paint ditherPaint = new Paint();
Paint drawPaint = new Paint();
if(null != bitmap)
{ int width = bitmap.getWidth();
int height = bitmap.getHeight();
FaceDetector detector = new FaceDetector(width, height,1);
Face[] faces = new Face[1];
//Bitmap bitmap565 = Bitmap.createBitmap(width, height, Config.RGB_565);
ditherPaint.setDither(true);
drawPaint.setColor(Color.RED);
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setStrokeWidth(2);
//canvas.setBitmap(bitmap565);
//canvas.drawBitmap(bitmap, 0, 0, ditherPaint);
int facesFound = detector.findFaces(bitmap, faces);
PointF midPoint = new PointF();
float eyeDistance = 0.0f;
// float confidence = 0.0f;
// Log.i("FaceDetector", "Number of faces found: " + facesFound);
if(facesFound > 0)
{
for(int index=0; index<facesFound; ++index)
{ // Get the eye distance, detected eye mid point and confidence
faces[index].getMidPoint(midPoint);
eyeDistance = faces[index].eyesDistance();
//confidence = faces[index].confidence();
//Log.i("FaceDetector",
// "Confidence: " + confidence +
//", Eye distance: " + eyeDistance +
//", Mid Point: (" + midPoint.x + ", " + midPoint.y + ")");
// Draw a small rectangle frame around the eye
canvas.drawRect((int)midPoint.x - eyeDistance ,
(int)midPoint.y - eyeDistance ,
(int)midPoint.x + eyeDistance,
(int)midPoint.y + eyeDistance, drawPaint);
}
}
}
super.onDraw(canvas);
} }
@覆盖
已创建的公共空白表面(表面持有人){
camera=camera.open();
试试{
摄像头。设置预览显示(支架);
camera.setPreviewCallback(新的PreviewCallback(){
预览帧上的公共无效(字节[]_数据,摄像头_摄像头){
//TODO对预览图像执行某些操作。
字节数据[]=\u数据;
位图b=位图工厂.decodeByteArray(数据,0,数据.length);
DrawOnTopMDraw.bitmap=b;
addContentView(mDraw,新布局参数
(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
//检测眼(位图);
}
});
}捕获(IOE异常)
{e.printStackTrace();
}
camera.startPreview();
}
类DrawOnTop扩展视图{
位图;
公共DrawOnTop(上下文,属性集属性){
//TODO自动生成的构造函数存根
超级(上下文、属性);
}
@凌驾
受保护的void onDraw(画布){
//TODO自动生成的方法存根
油漆抖动油漆=新油漆();
绘制drawPaint=新绘制();
如果(空!=位图)
{int width=bitmap.getWidth();
int height=bitmap.getHeight();
FaceDetector=新的FaceDetector(宽度、高度,1);
面[]面=新面[1];
//位图bitmap565=Bitmap.createBitmap(宽度、高度、配置.RGB_565);
抖动绘制。设置抖动(真);
drawPaint.setColor(颜色:红色);
drawPaint.setStyle(Paint.Style.STROKE);
拉丝漆。设置行程宽度(2);
//canvas.setBitmap(位图565);
//drawBitmap(位图,0,0,抖动绘制);
int facesFound=detector.findFaces(位图,面);
PointF中点=新的PointF();
浮动视距=0.0f;
//浮动置信度=0.0f;
//Log.i(“面部检测器”,“找到的面部数量:“+facesFound”);
如果(facesFound>0)
{
对于(int index=0;index我不知道这是否与您的FC有关,但我不会在onPreviewFrame回调中将字节数组解码为位图。每当我在相机预览顶部绘制自定义视图时,我都会将其添加到与SurfaceView相同的RelativeLayout中。@Rich hey thnx为了获得帮助,我将d解码部分移到了其他软件中每次收到新帧时,我都需要调用自定义视图的onDraw方法。你知道如何在不让应用程序再次崩溃的情况下这样做吗。如果你能给我指出一个类似的代码示例,这将是gr8帮助。再次提醒你,你知道出了什么问题吗?