调用原始缓冲图像时出现问题

时间:2013-12-17 11:46:00

标签: java opencv jlabel jdialog javacv

我在这里遇到了一些问题。现在我要做的是:

  1. 加载图片,
  2. 选择流程或过滤器,
  3. 生成。
  4. 我没有遇到3个步骤的问题,但是当我选择的ItemList是Process时,我想在第二个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 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;  
    }
    

    //我知道已经有OpenCV函数..但我们需要逐个像素地执行此操作,所以请耐心等待。 XD

0 个答案:

没有答案