2011-03-21 81 views
1

我正在将JavaCV用于大学项目。它本质上是一个运动检测器。在SWT画布上显示IplImage(JavaCV)

我使用OpenCVFrameGrabber类从网络摄像头获取帧,我想在我的GUI上显示抓取的帧。

我正在使用SWT,我认为将这些帧显示到Canvas组件中会很好。 我有一个问题,因为OpenCVFrameGrabber提供图像作为IplImage类的实例和SWT使用org.eclipse.swt.graphics.Image图像类。

所以我应该将图像从IplImage转换成SWT图像。做这个的最好方式是什么?

回答

1

我最近将BufferedImages(AWT)转换为SWT Image Objects。 我使用了以下代码片段:java2s.com

也许代码让你开始。或者某人已经将IplImages转换为BufferedImages,并且您可以“管”这两种转换方法。

干杯

+0

可以很容易地在AWT图像转换为缓冲的图像。 IplImage本身公开了一个方法来做到这一点,我认为这将是令人羡慕的。但由于swt的其他问题,团队决定切换回摆动状态,我们不需要再转换图像了......感谢您的帮助! – 2011-03-24 16:24:09

2
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingWorker; 

import com.googlecode.javacpp.Loader; 
import com.googlecode.javacv.*; 
import com.googlecode.javacv.cpp.*; 
import static com.googlecode.javacv.cpp.opencv_core.*; 

@SuppressWarnings("serial") 
public class CFrameTest extends JFrame { 
    JButton jbtStart; 
    JButton jbtStop; 
    CanvasFrame frame; 
    FrameGrabber grabber; 
    IplImage grabbedImage; 
    public CFrameTest() { 
     super("test"); 
     setSize(250, 100); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new GridLayout(1, 2)); 
     jbtStart = new JButton("Start camera"); 
     jbtStop = new JButton("Stop camera"); 
     this.add(jbtStart); 
     this.add(jbtStop); 
     setVisible(true); 
     jbtStart.addActionListener(
       new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         System.out.println("Startcap"); 
         jbtStart.setEnabled(false); 
         jbtStop.setEnabled(true); 
         try { 

          (new CameraSwingWorker()).execute(); 
          /*startCamera();*/ 


         } catch (Exception ex) { 
          Logger.getLogger(CFrameTest.class.getName()).log(Level.SEVERE, null, ex); 
         } 
        } 
       }); 
     jbtStop.addActionListener(
       new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         System.out.println("Stopcap"); 
         jbtStart.setEnabled(true); 
         jbtStop.setEnabled(false); 
         frame.setVisible(false); 
        } 
       }); 
     Loader.load(opencv_objdetect.class); 
    } 
    public static void main(String[] args) { 
     CFrameTest testFrame = new CFrameTest(); 
    } 
    public void startCamera() throws Exception { 
     frame = new CanvasFrame("Test"); 
     grabber = new OpenCVFrameGrabber(0); 
     CvMemStorage storage = CvMemStorage.create(); 
     grabber.start(); 
     grabbedImage = grabber.grab(); 
     while (frame.isVisible() && (grabbedImage = grabber.grab()) != null) 
     { 
      BufferedImage bfimg = grabbedImage.getBufferedImage(); 
      //grabbedImage.copyTo(bfimg); 
      frame.showImage(bfimg); 

      //frame.showImage(grabbedImage); 
      cvClearMemStorage(storage); 
     } 
     grabber.stop(); 
    } 


    class CameraSwingWorker extends SwingWorker<String, Object> { 
     @Override 
     public String doInBackground() { 
      try { 
       startCamera(); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return "yeah"; 
     } 

     @Override 
     protected void done() { 
      try {} catch (Exception ignore) { 
      } 
     } 
    } 




} 

/*javax.swing.SwingWorker*/