我一直收到这个错误 - "尝试调用虚方法' 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;
}
}
答案 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)
如果您将Activity
与new
实例化,则不包含必要的数据。您需要使用Context.startActivity
启动活动。
或者,您可以将Context
传递给run
并使用它来获取Resources
。但是,在活动中实现这一点毫无用处。
答案 2 :(得分:1)
检查res / Raw / lbpcascade_frontalface的大小是否超过1Mb或为null。压缩资源有1Mb的限制。