问题描述
- 谁来帮帮我运行android的时候出现这个问题怎么解决呢,回答有重赏。。。。。大神
-
05-20 05:07:15.757: W/dalvikvm(668): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
05-20 05:07:15.788: E/AndroidRuntime(668): FATAL EXCEPTION: main
05-20 05:07:15.788: E/AndroidRuntime(668): java.lang.NullPointerException
05-20 05:07:15.788: E/AndroidRuntime(668): at com.just.javacv.FaceDecetionForTest.loadTrainImageData(Androidbs2Activity.java:111)
05-20 05:07:15.788: E/AndroidRuntime(668): at com.just.javacv.Androidbs2Activity$1.onClick(Androidbs2Activity.java:42)
05-20 05:07:15.788: E/AndroidRuntime(668): at android.view.View.performClick(View.java:3511)
05-20 05:07:15.788: E/AndroidRuntime(668): at android.view.View$PerformClick.run(View.java:14105)
05-20 05:07:15.788: E/AndroidRuntime(668): at android.os.Handler.handleCallback(Handler.java:605)
05-20 05:07:15.788: E/AndroidRuntime(668): at android.os.Handler.dispatchMessage(Handler.java:92)
05-20 05:07:15.788: E/AndroidRuntime(668): at android.os.Looper.loop(Looper.java:137)
05-20 05:07:15.788: E/AndroidRuntime(668): at android.app.ActivityThread.main(ActivityThread.java:4424)
05-20 05:07:15.788: E/AndroidRuntime(668): at java.lang.reflect.Method.invokeNative(Native Method)
05-20 05:07:15.788: E/AndroidRuntime(668): at java.lang.reflect.Method.invoke(Method.java:511)
05-20 05:07:15.788: E/AndroidRuntime(668): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-20 05:07:15.788: E/AndroidRuntime(668): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-20 05:07:15.788: E/AndroidRuntime(668): at dalvik.system.NativeStart.main(Native Method)
package com.just.javacv;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;import com.googlecode.javacv.cpp.opencv_core.CvMat;
import com.googlecode.javacv.cpp.opencv_core.CvScalar;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import com.just.util.FileUtil;import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;public class Androidbs2Activity extends Activity {
private Button button;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button=(Button)this.findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) { // TODO Auto-generated method stub FaceDecetionForTest faceDecetion = new FaceDecetionForTest(); //项目根目录下的train文件夹中,保存有训练样本orl图像文件200张 String str1 = ".//train"; String[] photos = FileUtil.readImageFromDir(str1); //加载训练样本 faceDecetion.loadTrainImageData(photos); faceDecetion.doPCA(); System.out.println("特征矩阵的大小为:rows="+faceDecetion.result.rows()+",cols="+faceDecetion.result.cols()); String testImage = ".//test//orl_022_007.bmp"; faceDecetion.loadTestImageData(testImage); //显示识别结果
// faceDecetion.showResult(faceDecetion.photos, testImage);
System.out.println("识别结果文件路径:"+faceDecetion.getResultPhotoPath());
//将训练样本的特征矩阵写入文本文件中
try {
FileUtil.writeMatToFile(faceDecetion.getResult(), ".//data//cvMat.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// CvMat mat = FileUtil.readerMatFromFile(".//data//cvMat.txt");} }); }
}
/**- 人脸识别图像PCA降维处理类,该类可加载某一文件夹中的图像,进行PCA降维生成特征矩阵
- @author Administrator
*
*/
class FaceDecetionForTest{//待训练的数据
private CvMat trainImagesRow;//待识别的数据
private CvMat testImagesRow;//降维后的特征矩阵
CvMat result;//测试样本得到的特征向量
private CvMat result2;private CvMat avg;
private CvMat eigenVectors;
//训练样本图像路径的集合
private ArrayList photos;public FaceDecetionForTest() {
//初始化数据
this.trainImagesRow = null;
this.testImagesRow = null;
this.result = new CvMat();
this.result2 = new CvMat();
this.avg = new CvMat();
this.eigenVectors = new CvMat();
this.photos = new ArrayList();
}/**
- 加载训练图片
- @param imageList
*/
public void loadTrainImageData(String[] photoArray) {//将读取到的图像路径保存在photos中,一边识别时按序号找到文件路径
for (int i = 0; i < photoArray.length; i++) {
photos.add(photoArray[i]);
}//按照图像文件路径,将图像加载为IplImage数据,并按顺序保存至faces中
ArrayList faces = new ArrayList();
for (int i = 0; i < photoArray.length; i++) {
IplImage tempImage = cvLoadImage(photoArray[i],0);
faces.add(tempImage);
}//获取训练样本的大小rows*cols
int rows = faces.size();
int cols = faces.get(0).width()*faces.get(0).height();//设定训练样本的矩阵的大小和数据类型
trainImagesRow = cvCreateMat(rows,cols,CV_32FC1);//在控制台输出训练样本的大小
System.out.println("训练样本库的大小为:rows="+rows+",cols="+cols);//输出训练样本的个数
System.out.println("训练样本的个数为facesSize="+faces.size());
System.out.println("单个训练样本的大小为:rows="+faces.get(0).height()+",cols="+faces.get(0).width());//循环获取faces中的数据,将IplImage转换为CvMat后加载至训练样本矩阵中
for (int i = 0; i < faces.size(); i++) {IplImage image = faces.get(i); //根据图像的大小生成同样大小的矩阵 CvMat mat = cvCreateMat(image.height(), image.width(), CV_32FC1); //将图像数据转换为矩阵保存 cvConvert(image, mat); int index = 0; //将一幅图像图像转换为 训练矩阵中的一行 保存 for (int j2 = 0; j2 < mat.rows(); j2++) { for (int k = 0; k < mat.cols(); k++) { trainImagesRow.put(i, index, mat.get(j2, k)); index++; } }
}
}
/**
- 加载测试样本
- @param imagePath 测试样本图像文件的路径
*/
public void loadTestImageData(String imagePath) {
//根据图像文件的路径,将文件加载为IplImage类型
IplImage image = cvLoadImage(imagePath,0);//根据image生成同样大小的测试样本矩阵
testImagesRow = cvCreateMat(1, image.width()*image.height(), CV_32FC1);//将图像数据保存为CvMat后加载至测试样本矩阵中
CvMat mat = cvCreateMat(image.height(), image.width(), CV_32FC1);
cvConvert(image, mat);int index = 0;
for (int i = 0; i < mat.rows(); i++) {
for (int j = 0; j < mat.cols(); j++) {
testImagesRow.put(0,index,mat.get(i,j));
index++;
}
}//按照测试样本的大小,生成测试样本特征向量的大小 ()
result2 = cvCreateMat(testImagesRow.rows(), result.cols(), CV_32FC1);
System.out.println("测试样本特征向量的大小rows="+result2.rows()+",cols="+result2.cols());
//生成测试样本特征向量
cvProjectPCA(testImagesRow, avg, eigenVectors, result2);
}
public void doPCA(){
System.out.println("doPCA……start"); avg = cvCreateMat(1, trainImagesRow.cols(), CV_32FC1); //训练特征向量 CvMat eigenValues = cvCreateMat(1, Math.min(trainImagesRow.rows(), trainImagesRow.cols()), CV_32FC1); eigenVectors = cvCreateMat(Math.min(trainImagesRow.rows(), trainImagesRow.cols()), trainImagesRow.cols(), CV_32FC1); //取特征向量的前P个特征值,作为比较结果 result = cvCreateMat(trainImagesRow.rows(), Math.min(trainImagesRow.rows(), trainImagesRow.cols()), CV_32FC1); cvCalcPCA(trainImagesRow, avg, eigenValues, eigenVectors, CV_PCA_DATA_AS_ROW); //生成训练样本特征矩阵 cvProjectPCA(trainImagesRow, avg, eigenVectors, result); System.out.println("doPCA……over");
}
/**
- 显示识别结果
- @param photos 保存训练样本图像的list集合
- @param testImage 测试样本图像的路径
*/
public void showResult(ArrayList photos,String testImage) {//取得是被结果的类序号
int num = euclideanDistance(result, result2);//按类序号乘以类中图片的数量,获取识别结果的图像路径,显示图像
cvShowImage("result", cvLoadImage(photos.get(num*5)));//根据测试样本图像的路径,显示图像
cvShowImage("src", cvLoadImage(testImage));cvWaitKey(5000);
}
/**
- 获取欧式距离
- @param trainData
- @param testData
- @return
*/
public int euclideanDistance(CvMat trainData,CvMat testData) {double[] num = new double[trainData.rows()];
//获取测试样本特征向量与训练样本特征矩阵每一行的欧式距离
for (int i = 0; i < trainData.rows(); i++) {
double sum = 0;
for (int j = 0; j < trainData.cols(); j++) {
sum += Math.pow(Math.abs(trainData.get(i, j))-Math.abs(testData.get(0, j)), 2);
}
num[i] = Math.sqrt(sum);
}
//获取欧氏距离的和中最小的类的序号
return minArrayElement(num);
}
private int minArrayElement(double[] array) {
//将欧氏距离按类相加
double classifyArray[] = new double[array.length/5];
int count = 0;
for (int i = 0; i < array.length; i++) {
if (i%5==0&&i!=0) {
count++;
}else {
classifyArray[count]+= array[i];
}
}//求类间欧氏距离和的最小值,index为该类的序号 int index = 0; double min = classifyArray[0]; for (int i = 0; i < classifyArray.length; i++) { if (min>classifyArray[i]) { min = classifyArray[i]; index = i; } } return index;
}
/**
- 获取识别结果的文件路径
- @return
*/
public String getResultPhotoPath() {
int num = euclideanDistance(result, result2);
return photos.get(num*5);
}
public CvMat getResult() {
return result;
}public void setResult(CvMat result) {
this.result = result;
}
}
解决方案
空指针异常, 贴一下Androidbs2Activity.java文件的代码, 不然怎么看是什么问题
解决方案二:
05-20 05:07:15.788: E/AndroidRuntime(668): at com.just.javacv.Androidbs2Activity$1.onClick(Androidbs2Activity.java:42)
解决方案三:
Androidbs2Activity 里第111行。。。空指针
解决方案四:
Androidbs2Activity.java:111,第111行有对象你没有判断null值
解决方案五:
空指针,lz学会开logcat哦
解决方案六:
5-20 05:07:15.788: E/AndroidRuntime(668): at com.just.javacv.Androidbs2Activity$1.onClick(Androidbs2Activity.java:42
判断一下里边的那个东西空了,然后修改空的值,就行
解决方案七:
看logcat,debug也行呢
解决方案八:
String[] photos = FileUtil.readImageFromDir(str1); 可能是这个为空,你打Log出来看看这个photos是否为null吧。。。