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帮助。再次提醒你,你知道出了什么问题吗?