2011-03-21 85 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*/