我在这里遇到了一些问题。现在我要做的是:
我没有遇到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