0

で遊んでいますFaceDetectionListener。私の目的は、目の周りに円を描くことです。というSurfaceView名前previewSurfaceHolderオブジェクトと という名前のオブジェクトがありますpreviewHolder

すべてが非常にうまく機能SurfaceViewし、バックカメラを使用して、自分の中に表されている顔の数を検出できます。また、左右の目の周りに円を描きたいと思います。私のdrawCanvas方法は次のようになります。

      private void drawCanvas(float x, float y) {
            Canvas canvas = previewHolder.lockCanvas();
            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

            paint.setColor(Color.BLACK);
            paint.setDither(true); 
            paint.setColor(0xFFFFFF00);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeCap(Paint.Cap.ROUND);
            paint.setStrokeWidth(3);

            canvas.drawPoint(x, y, paint);
            previewHolder.unlockCanvasAndPost(canvas);
      }

このメソッドは から呼び出されますFaceDetectionListener:

      @Override
      public void onFaceDetection(Face[] faces, Camera camera) {

       if (faces.length > 0) {
           tv.setText(String.valueOf(faces.length) + " Face(s) Detected");

           for(Face f : faces) {

               int leftEyeXCoordinate =  f.leftEye.x;
               int leftEyeYCoordinate = f.leftEye.y;
               drawCanvas(leftEyeXCoordinate, leftEyeYCoordinate);

               int rightEyeXCoordinate = f.rightEye.x;
               int rightEyeYCoordinate = f.rightEye.y;
               drawCanvas(rightEyeXCoordinate, rightEyeYCoordinate);
           }
       }
       else
           tv.setText("No Faces Detected!");
      }};

行で NullPointerException を取得し続けます int leftEyeXCoordinate = f.leftEye.x;

カメラが動き回っている間に、点や四角形などを描画できますか? それとも、最初に写真をキャプチャする必要がありますか?

私の質問は次のとおりです。以前にこれを達成した人がいて、どうすればできるか教えてください。

ありがとう!

4

1 に答える 1

1

ええ、私もこの問題を見てきました。返される Face オブジェクトは、FaceDetector.Face ではなく android.hardware.Camera.Face であり、rect オブジェクトのみがそこに有効な情報を持っています。rect オブジェクトの境界は、カメラ座標系にあります。それらをビュー座標系に変換する必要があります。rectの下のこのリンクで説明されています。

于 2013-03-11T17:28:18.187 に答える