我已经回顾了很多与我的主题相关的问题,因为我能够理解如何发生此异常,但不明白为什么此异常正在发生在我执行的代码中。下面的类有两个参数:包含训练面的目录的路径以及要分类的图像的路径。这实际上不是我的代码,它是由Petter Christian Bjelland编写的......以下是代码
public class OpenCVFaceRecognizer {
public static void main(String[] args) {
String trainingDir = args[0];
Object testImage = Highgui.imread(args[1], 0);
File root = new File(trainingDir);
FilenameFilter imgFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
name = name.toLowerCase();
return name.endsWith(".jpg") || name.endsWith(".pgm") || name.endsWith(".png");
}
};
File[] imageFiles = root.listFiles(imgFilter);
MatVector images = new MatVector(imageFiles.length);
Mat labels = new Mat(imageFiles.length, 1, CV_32SC1);
IntBuffer labelsBuf = labels.createBuffer();
int counter = 0;
for (File image : imageFiles) {
Object img = Highgui.imread(image.getAbsolutePath(), 0);
int label = Integer.parseInt(image.getName().split("\\-")[0]);
images.put(counter, (Mat) img);
labelsBuf.put(counter, label);
counter++;
}
FaceRecognizer faceRecognizer = createFisherFaceRecognizer();
faceRecognizer.train(images, labels);
int predictedLabel = faceRecognizer.predict((Mat) testImage);
System.out.println("Predicted label: " + predictedLabel);
}
}
以下是完整的例外
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at OpenCVFaceRecognizer.main(OpenCVFaceRecognizer.java:40)
这是第40行String trainingDir = args[0];
答案 0 :(得分:0)
嗯,你需要在启动代码时实际传递这些参数
java OpenCVFaceRecognizer <pathToDirectory> <pathToImageToClassify>
如果您正在使用Eclipse,那么可以在运行代码时传递参数。
查看其他SO帖子:
答案 1 :(得分:0)
由于ArrayIndexOutOfBoundsException是主方法字符串参数,它意味着在运行应用程序时,您需要将字符串数组作为命令行参数传递。如果您正在使用任何编辑器,则需要在编辑器的运行配置中设置运行时参数
用于命令行java OpenCVFaceRecognizer <pathToDirectory> <pathToImageToClassify>
答案 2 :(得分:0)
答案 3 :(得分:0)
args数组包含通过命令行传递给main方法的项目数。例如,如果你这样开始你的程序:
java OpenCVFaceRecognizer c:\data\images c:\data\tobeclassified.jpg
args将包含两个元素,“c:\ data \ images”和“c:\ data \ tobeclassified.jpg”。该异常表示该程序在没有命令行参数的情况下启动(因为索引0已经超出了允许索引的范围,这是数组为空时的情况)。