Java 捕获的网络摄像头图像未刷新,最大尺寸太大无法显示

Java 捕获的网络摄像头图像未刷新,最大尺寸太大无法显示,java,swing,webcam,javacv,Java,Swing,Webcam,Javacv,我的程序有一些问题。我有一个GUI,它在一边显示来自网络摄像头的实时图像(使用[jvacv][1]),在另一边显示捕获的图像。要捕获图像,我有一个按钮。一个问题是,只有在我关闭并再次打开程序时,捕获的图像才会刷新。另一个是,我想从网络摄像头中拍摄一张1080p的图像,但要拍摄640x480的实时图像 代码如下: import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionList

我的程序有一些问题。我有一个GUI,它在一边显示来自网络摄像头的实时图像(使用[jvacv][1]),在另一边显示捕获的图像。要捕获图像,我有一个按钮。一个问题是,只有在我关闭并再次打开程序时,捕获的图像才会刷新。另一个是,我想从网络摄像头中拍摄一张1080p的图像,但要拍摄640x480的实时图像

代码如下:

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException; 
import java.lang.ProcessBuilder.Redirect;


import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.SwingUtilities;

import com.googlecode.javacv.FrameGrabber;
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.FrameGrabber.Exception;
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import static com.googlecode.javacv.cpp.opencv_highgui.*;


public class Final 
{
private VideoPanel videoPanel = new VideoPanel();
private ImagePanel imagePanel   = new ImagePanel();
private JButton jbtCapture = new JButton("Captura");
private JRadioButton jbtAutoCap = new JRadioButton("Captura Automatica");
private FrameGrabber vision;
private BufferedImage image;
private IplImage gimage;


public class VideoPanel extends JPanel
{

public VideoPanel()
{
    vision = new OpenCVFrameGrabber(0);
    try 
    {
        vision.start();
    } catch (Exception e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}


public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    try {
        image = vision.grab().getBufferedImage();
        if (image != null)
        {
            g.drawImage(image, 0, 0, 640, 480, null);
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    repaint();
}
}



class ImagePanel extends JPanel
{
private BufferedImage image;


public ImagePanel()
{
    try {
        image = ImageIO.read(new File("image001.bmp"));
    } catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    if(image != null)
    {

        g.drawImage(image,5,0,640,480, null);


    }

}


}



private void displayGUI()
{
JFrame janela = new JFrame();


JPanel jpButton = new JPanel();
jpButton.setLayout(null);


jbtCapture.setBounds(145,0,110,30);
jpButton.add(jbtCapture);

jbtAutoCap.setBounds(0, 5, 140, 23);
jpButton.add(jbtAutoCap);

janela.setLayout(null);

videoPanel.setBounds(5, 5, 640, 480);
janela.add(videoPanel);

imagePanel.setBounds(705,5,640,480);
janela.add(imagePanel);

jpButton.setBounds(5, 500, 670, 40);
janela.add(jpButton);

janela.setSize(1366,730);
janela.setVisible(true);


jbtCapture.addActionListener(
           new ActionListener() 
           {
              public void actionPerformed(ActionEvent e)
              {

                 try {
                    gimage = vision.grab();
                    cvSaveImage("image001.bmp", gimage);

                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }




              }
           }
       );

}



public static void main(String[] args) 
{
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() 
{

    @Override
    public void run() 
    {
        // TODO Auto-generated method stub
        new Final().displayGUI();
    }
});

}
}

我建议罪犯没有使用事件调度线程。请仔细阅读。此外,为什么要在
paintComponent(…)
方法中请求一个
repaint()
,删除它,在该方法中执行该操作,从同一方法中间接调用该方法确实不是一件好事。如果我删除repaint(),网络摄像头中的图像不会刷新。我将阅读有关并发性的文章,ty,还添加了一些其他问题。我本人从未使用过API,因此无法提供该领域的太多信息。虽然你在Swing代码中犯了什么错误是我告诉你的。可能是,一旦您将代码放入main方法中,
SwingUtilities.invokeLater(new Runnable(){//main方法中的代码。})中,就会对刷新内容进行排序为了更好地关注该问题,对其进行了投票:-)您可以发布示例或修改代码吗?我是swing新手,没有足够的时间阅读所有关于并发性的教程。对不起我的英语。说实话,如果我使用了javacv的API,我肯定会发表我的评论作为回答,尽管我只知道Swing,因此我不能给你更多关于这方面的细节。只需将负责创建和显示GUI的代码放在EDT上,就可以查看任何使用这种方法的代码。不要从主界面开始Swing,让
SwingUtilities.invokeLater(…)
在EDT上为您完成这项工作。如果您要从自己创建的任何线程更新GUI,请始终放置该GUI更新代码