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
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)
tryCvMat mtx=load.clone()
这应该复制图像,而不是使用相同的数据array@Micka是的,我想是的。。但现在我们不允许使用它,所以我有点用它。。