OpenCv 3.1-Java中给定矩阵的错误形状
我已经训练了人脸识别器,所有的图像都是相同大小的,并将灰度图像传递给预测器。但我面临着这个错误 OpenCV错误:错误参数(给定矩阵的形状错误。Was大小(src)=(1150544),大小(W)=(37636,5)。)在子空间项目中,文件/home/********/OpenCV/modules/core/src/lda.cpp,第182行 这是密码OpenCv 3.1-Java中给定矩阵的错误形状,java,c++,opencv,matrix,machine-learning,Java,C++,Opencv,Matrix,Machine Learning,我已经训练了人脸识别器,所有的图像都是相同大小的,并将灰度图像传递给预测器。但我面临着这个错误 OpenCV错误:错误参数(给定矩阵的形状错误。Was大小(src)=(1150544),大小(W)=(37636,5)。)在子空间项目中,文件/home/********/OpenCV/modules/core/src/lda.cpp,第182行 这是密码 public static void main(String[] args) { System.loadLibrary(Core
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
String trainingDir = "res/";
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);
ArrayList <Mat> images = new ArrayList(imageFiles.length);
Mat labels = new Mat(imageFiles.length,1,CvType.CV_32SC1);
int[][] labelsBuffer = new int[imageFiles.length][imageFiles.length];
int counter =0;
for(File image: imageFiles){
Mat img = Imgcodecs.imread(image.getAbsolutePath(),Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
int label = Integer.parseInt(image.getName().split("\\.")[2]);
//images.add(label, img);
images.add(img);
counter++;
}
FaceRecognizer faceRecognizer = Face.createEigenFaceRecognizer();
Mat temp = new Mat();
faceRecognizer.train(images, labels);
CascadeClassifier cascadeFaceClassifier = new CascadeClassifier(
"haarcascade_frontalface_default.xml");
VideoCapture videoDevice = new VideoCapture();
videoDevice.open(0);
int x = 0;
if (videoDevice.isOpened()) {
while (true) {
Mat frameCapture = new Mat();
videoDevice.read(frameCapture);
MatOfRect faces = new MatOfRect();
cascadeFaceClassifier.detectMultiScale(frameCapture, faces, 2.0, 5, 0,new Size(),new Size());
for (Rect rect : faces.toArray()) {
Mat resizedCapture = new Mat(frameCapture,rect);
Imgproc.cvtColor(resizedCapture, resizedCapture, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
Size imageSize = new Size(194,194);
Imgproc.resize(resizedCapture,resizedCapture , imageSize);
System.out.println(images.get(0).rows());
System.out.println(resizedCapture.rows());
System.out.println(images.get(0).cols());
System.out.println(resizedCapture.cols());
try{
x = faceRecognizer.predict_label(resizedCapture);
}catch(Exception e){
System.out.println(e.getMessage());
}
x++;
Imgproc.putText(frameCapture, "Face"+x, new Point(rect.x,rect.y-5), 1, 2, new Scalar(0,0,255));
Imgproc.rectangle(frameCapture, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),new Scalar(0, 100, 0),3);
}
PushImage(ConvertMat2Image(frameCapture));
//System.out.println(String.format("FACES = %s EYES = %s detected.", faces.toArray().length,eyes.toArray().length,nose.toArray().length));
}
} else {
System.out.println("Video Device Not Working");
return;
}
}
private static BufferedImage ConvertMat2Image(Mat matImage) {
MatOfByte matOfByte = new MatOfByte();
Imgcodecs.imencode(".jpg", matImage, matOfByte);
byte[] byteArray = matOfByte.toArray();
BufferedImage img = null;
try {
InputStream in = new ByteArrayInputStream(byteArray);
img = ImageIO.read(in);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return img;
}
public static void PencereHazirla() {
frame = new JFrame();
frame.setLayout(new FlowLayout());
frame.setSize(700, 600);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void PushImage(Image img2) {
if (frame == null)
PencereHazirla();
if (lbl != null)
frame.remove(lbl);
icon = new ImageIcon(img2);
lbl = new JLabel();
lbl.setIcon(icon);
frame.add(lbl);
frame.revalidate();
}
}
publicstaticvoidmain(字符串[]args){
System.loadLibrary(Core.NATIVE\u LIBRARY\u NAME);
字符串trainingDir=“res/”;
文件根=新文件(trainingDir);
FilenameFilter imgFilter=新FilenameFilter(){
公共布尔接受(文件目录,字符串名称){
name=name.toLowerCase();
返回name.endsWith(“.jpg”)| | name.endsWith(“.pgm”)| | name.endsWith(“.png”);
}
};
File[]imageFiles=root.listFiles(imgFilter);
ArrayList images=新的ArrayList(imageFiles.length);
Mat标签=新Mat(imageFiles.length,1,CvType.CV_32SC1);
int[][]labelsBuffer=新int[imageFiles.length][imageFiles.length];
int计数器=0;
用于(文件图像:imageFiles){
Mat img=Imgcodecs.imread(image.getAbsolutePath(),Imgcodecs.CV\u LOAD\u image\u GRAYSCALE);
int label=Integer.parseInt(image.getName().split(“\\”)[2]);
//图像。添加(标签、img);
图像。添加(img);
计数器++;
}
FaceRecognizer FaceRecognizer=Face.createEigenFaceRecognizer();
材料温度=新材料();
人脸识别器。序列(图像、标签);
CascadeClassifier cascadeFaceClassifier=新的CascadeClassifier(
“haarcascade_frontalface_default.xml”);
VideoCapture videoDevice=新的VideoCapture();
videoDevice.open(0);
int x=0;
if(videoDevice.isOpened()){
虽然(正确){
Mat frameCapture=新Mat();
视频设备读取(帧捕获);
MatOfRect面=新的MatOfRect();
检测多尺度(帧捕获,面,2.0,5,0,新大小(),新大小());
for(Rect-Rect:faces.toArray()){
Mat resizedCapture=新Mat(帧捕获,rect);
Imgproc.cvt颜色(resizedCapture、resizedCapture、imgCodes.CV\u LOAD\u IMAGE\u GRAYSCALE);
尺寸图像尺寸=新尺寸(194);
Imgproc.resize(resizedCapture、resizedCapture、imageSize);
System.out.println(images.get(0.rows());
System.out.println(resizedCapture.rows());
System.out.println(images.get(0.cols());
System.out.println(resizedCapture.cols());
试一试{
x=人脸识别器。预测标签(resizedCapture);
}捕获(例外e){
System.out.println(e.getMessage());
}
x++;
Imgproc.putText(帧捕获,“面”+x,新点(rect.x,rect.y-5),1,2,新标量(0,0255));
Imgproc.矩形(帧捕获,新点(rect.x,rect.y),新点(rect.x+rect.width,rect.y+rect.height),新标量(0,100,0),3);
}
PushImage(ConvertMat2Image(frameCapture));
//System.out.println(String.format(“FACES=%s EYES=%s detected.”,FACES.toArray().length,EYES.toArray().length,nose.toArray().length));
}
}否则{
System.out.println(“视频设备不工作”);
返回;
}
}
专用静态缓冲区映像转换器MAT2IMAGE(Mat matImage){
MatOfByte MatOfByte=新MatOfByte();
Imgcodecs.imencode(“.jpg”,matImage,matOfByte);
字节[]byteArray=matOfByte.toArray();
BuffereImage img=null;
试一试{
InputStream in=新的ByteArrayInputStream(byteArray);
img=图像IO.read(in);
}捕获(例外e){
e、 printStackTrace();
返回null;
}
返回img;
}
公共静态无效铅笔(){
frame=新的JFrame();
frame.setLayout(新的FlowLayout());
框架设置尺寸(700600);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
公共静态图像(图像img2){
if(frame==null)
铅笔花();
如果(lbl!=null)
框架。移除(lbl);
图标=新图像图标(img2);
lbl=新的JLabel();
lbl.setIcon(图标);
帧。添加(lbl);
frame.revalidate();
}
}
我正在尝试Image.cvt颜色,并使用Imagecodecs将其转换为灰度,增加了4倍。
解决办法是
Imgproc.cvtColor(resizedCapture, resizedCapture, Imgproc.COLOR_BGR2GRAY);
请不要发布完整的代码,这可能会导致没有人会阅读您的问题。@BahramdunAdil感谢您的建议。但问题是,我认为这种问题必须与整个代码一起发布。这只是我所说的问题的代码about@Hasnain您需要创建一个演示问题的最低限度的代码示例,从一次又一次地删除无关的代码开始,直到您有了只包含复制问题所需的代码的东西。看:@MarkOmo非常感谢你,下次我会处理好的。