在Android相机

时间:2015-08-11 12:35:02

标签: android camera

我一直收到这个错误 - "尝试调用虚方法' android.content.res.Resources android.content.Context.getResources()'在null对象引用"

我制作了一个可以保存图像的相机。我现在正在尝试检测该图像中的面部,但是当我运行代码时,我一直收到此错误..任何帮助?我相信它是因为我没有将上下文传递给facedetection类,但是我尝试了许多尝试而没有成功..谢谢

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        Camera();

        jpegCallback = new Camera.PictureCallback() {

            public void onPictureTaken(byte[] data, Camera camera) {
                Mat jpegData = new Mat(1, data.length, CvType.CV_8UC1);
                jpegData.put(0, 0, data);

                Mat bgrMat = Imgcodecs.imdecode(jpegData, Imgcodecs.IMREAD_COLOR);
                Core.transpose(bgrMat, bgrMat);
                Core.flip(bgrMat, bgrMat, 0);
                Imgproc.resize(bgrMat, bgrMat, bgrMat.size());

                File storagePath = new File(Environment.
                        getExternalStorageDirectory() + "/Emotion Detection/");
                storagePath.mkdirs();
                File myImage = new File(storagePath,
                        Long.toString(System.currentTimeMillis()) + ".jpg");
                String imageString = myImage.toString();
                Mat newMat = new FaceDetection().run(bgrMat);
                Imgcodecs.imwrite(imageString, newMat);

                camera.startPreview();
                Toast.makeText(MainActivity.this,
                        "Picture Saved", Toast.LENGTH_LONG).show();
            }
        };
    }

然后在我的facedetection类中:

class FaceDetection extends Activity {

    private static final String    TAG                 = "OCVSample::Activity";
    private CascadeClassifier      mJavaDetector;
    private File                   mCascadeFile;

    public Mat run(Mat image) {
        System.out.println("\nRunning Face Detection");
        // Create a face detector from the cascade file in the resources
        // directory.
        // load cascade file from application resources
        InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);
        File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
        mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");
        try {
            FileOutputStream os = new FileOutputStream(mCascadeFile);
        } catch (IOException e) {
            e.printStackTrace();
        }

        mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath());
        if (mJavaDetector.empty())
        {
            Log.e(TAG, "Failed to load cascade classifier");
            mJavaDetector = null;
        }
        else
            Log.i(TAG, "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());

        cascadeDir.delete();


        // Detect faces in the image.
        // MatOfRect is a special container class for Rect.
        MatOfRect faceDetections = new MatOfRect();
        mJavaDetector.detectMultiScale(image, faceDetections);

        System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
        // Draw a bounding box around each face.
        for (Rect rect : faceDetections.toArray()) {
            rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
        }

        return image;
    }
}

3 个答案:

答案 0 :(得分:3)

如果FaceDetection类只有run()方法并且没有其他任何操作,那么看起来它不需要是一个Activity。 根据Google的文档:

  

活动是一个应用程序组件,它提供了一个屏幕,用户可以通过该屏幕进行交互以执行某些操作,例如拨打电话,拍照,发送电子邮件或查看地图。

由于您的活动未提供与用户交互的屏幕,请从FaceDetection类中删除extends Activity并将其从活动包中取出(将其放在utils文件夹中,可能吗?取决于您的范围/体系结构)。

最后,要从活动外部调用getDir()等方法,您需要Context

在您的方法中添加context参数,例如public Mat run(Mat image, Context context)并通过您的上下文访问getDir()context.getDir()

您将传递给方法的上下文可以是调用该方法的Activity。

希望这有帮助。

答案 1 :(得分:1)

如果您将Activitynew实例化,则不包含必要的数据。您需要使用Context.startActivity启动活动。

或者,您可以将Context传递给run并使用它来获取Resources。但是,在活动中实现这一点毫无用处。

答案 2 :(得分:1)

检查res / Raw / lbpcascade_frontalface的大小是否超过1Mb或为null。压缩资源有1Mb的限制。