Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCv 3.1-Java中给定矩阵的错误形状_Java_C++_Opencv_Matrix_Machine Learning - Fatal编程技术网

OpenCv 3.1-Java中给定矩阵的错误形状

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

我已经训练了人脸识别器,所有的图像都是相同大小的,并将灰度图像传递给预测器。但我面临着这个错误

OpenCV错误:错误参数(给定矩阵的形状错误。Was大小(src)=(1150544),大小(W)=(37636,5)。)在子空间项目中,文件/home/********/OpenCV/modules/core/src/lda.cpp,第182行

这是密码

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非常感谢你,下次我会处理好的。