Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
Java 调用原始缓冲映像时遇到问题_Java_Opencv_Jlabel_Jdialog_Javacv - Fatal编程技术网

Java 调用原始缓冲映像时遇到问题

Java 调用原始缓冲映像时遇到问题,java,opencv,jlabel,jdialog,javacv,Java,Opencv,Jlabel,Jdialog,Javacv,我这里有些问题。现在我要做的是: 加载一个图像 选择一个进程或过滤器 生成 我对这3个步骤没有问题,但我希望在处理选定的ItemList时,在第二个Jlabel中保留加载的图像,然后再次生成处理后的图像 private void btnLoadActionPerformed(java.awt.event.ActionEvent evt) { JFileChooser fc = new JFileChooser

我这里有些问题。现在我要做的是:

  • 加载一个图像
  • 选择一个进程或过滤器
  • 生成 我对这3个步骤没有问题,但我希望在处理选定的ItemList时,在第二个Jlabel中保留加载的图像,然后再次生成处理后的图像

    private void btnLoadActionPerformed(java.awt.event.ActionEvent evt) {                                        
        JFileChooser fc = new JFileChooser();
        FileFilter filter = new FileNameExtensionFilter("JPEG File", "jpg", "jpeg", "png", "bmp");
        fc.setFileFilter(filter);
        int choice = fc.showOpenDialog(this);
        if (choice == JFileChooser.APPROVE_OPTION) {
            load = cvLoadImage(fc.getSelectedFile().getAbsolutePath());
            if (load != null)
                src.setIcon(new ImageIcon(load.getBufferedImage()));
            else
                JOptionPane.showMessageDialog(null, "Failed to load image.");
        }
    }
    
    现在,这个程序所做的是生成所需的过滤器,但当我应用另一个过滤器时,将被过滤的图像是前一个已经过滤的图像,而不是实际加载的图像

    private void btnLoadActionPerformed(java.awt.event.ActionEvent evt) {                                        
        JFileChooser fc = new JFileChooser();
        FileFilter filter = new FileNameExtensionFilter("JPEG File", "jpg", "jpeg", "png", "bmp");
        fc.setFileFilter(filter);
        int choice = fc.showOpenDialog(this);
        if (choice == JFileChooser.APPROVE_OPTION) {
            load = cvLoadImage(fc.getSelectedFile().getAbsolutePath());
            if (load != null)
                src.setIcon(new ImageIcon(load.getBufferedImage()));
            else
                JOptionPane.showMessageDialog(null, "Failed to load image.");
        }
    }
    
    //此方法适用于单击“生成”按钮向图像添加过滤器时

    private void genActionPerformed(java.awt.event.ActionEvent evt) {
    
           if(cbo.getSelectedItem().equals("Process..")){
            JOptionPane.showMessageDialog(null, "Choose a filter");
              } else if(cbo.getSelectedItem().equals("Grayscale")){
            if(load != load){
                fx = toGray(load);
                dst.setIcon(new ImageIcon(fx.getBufferedImage()));
              } else{
                JOptionPane.showMessageDialog(null, "No image loaded.");
              }
         }
    
    //这是用于toGray方法的

    public static IplImage toGray(IplImage load){                          
        IplImage toGray = null;
        double r, g, b, gray;
        CvMat mtx = CvMat.createHeader(load.height(), load.width(), CV_32FC1);
        cvGetMat(load, mtx, null, 0);
        CvScalar rgb, scalar;
            for(int i = 0; i < ((mtx.rows())-1); i++){
                for(int j = 0; j < (mtx.cols()-1); j++){
                    rgb = cvGet2D(mtx, i, j);
                    r = rgb.getVal(0);
                    g = rgb.getVal(1);
                    b = rgb.getVal(2);
                    gray = (r+b+g)/3;
                        scalar = new CvScalar(gray, gray, gray, 0);
                        cvSet2D(mtx, i, j, scalar);
                    }
    }
     toGray = mtx.asIplImage();
     return toGray;  
    }
    
    publicstaticiplimage-toGray(IplImage-load){
    IplImage-toGray=null;
    双r,g,b,灰色;
    CvMat mtx=CvMat.createHeader(load.height()、load.width()、CV_32FC1);
    cvGetMat(加载,mtx,空,0);
    CVRGB标量,标量;
    对于(int i=0;i<((mtx.rows())-1);i++){
    对于(int j=0;j<(mtx.cols()-1);j++){
    rgb=cvGet2D(mtx,i,j);
    r=rgb.getVal(0);
    g=rgb.getVal(1);
    b=rgb.getVal(2);
    灰色=(r+b+g)/3;
    标量=新标量(灰色,灰色,灰色,0);
    cvSet2D(mtx,i,j,标量);
    }
    }
    toGray=mtx.asIplImage();
    回归射线;
    }
    

    //我知道已经有OpenCV函数用于此。。但是我们需要一个像素一个像素地做,所以请忍受我。XD

    我建议多放一点代码。从您所展示的内容中,我首先想到的是“if(load==load)”,如果它们不是不同的变量(一个是类变量,另一个是传递给方法的参数,我对此表示怀疑),那么这与输入“if(true)”是一样的?在C++ OpenCV中,你必须调用.COMTO(Mat),否则你将工作在缓冲映像的数据上(下一个想要访问缓冲映像的人将得到修改/过滤的缓冲图像)嘿,谢谢,我已经把它改为加载!提示已为null@米卡,是的。。这正是我的程序所做的,如果您使用加载的图像,并在使用过滤后的图像时对其进行过滤,如果您使用不同的过程对其进行过滤。当使用图像处理不同的过滤器时,我如何能够坚持加载的图像?@ECE179Stud使用toGray方法,而不是
    CvMat mtx=CvMat.createHeader(load.height()、load.width()、CV_32FC1)
    try
    CvMat mtx=load.clone()
    这应该复制图像,而不是使用相同的数据array@Micka是的,我想是的。。但现在我们不允许使用它,所以我有点用它。。