2011-03-21 3 views
1

대학 프로젝트에 JavaCV를 사용하고 있습니다. 본질적으로 동작 탐지기입니다.SWT 캔버스에 IplImage (JavaCV) 표시

OpenCVFrameGrabber 클래스를 사용하여 웹캠에서 프레임을 가져오고 내 GUI에 잡은 프레임을 표시하려고합니다.

SWT를 사용하고 있는데 프레임을 Canvas 구성 요소에 표시하는 것이 좋을 것이라고 생각했습니다. OpenCVFrameGrabber가 IplImage 클래스의 인스턴스로 이미지를 제공하고 SWT가 org.eclipse.swt.graphics.Image 이미지 클래스를 사용하기 때문에 문제가 있습니다.

그래서 IplImage에서 SWT Image로 이미지를 변환해야합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

답변

1

최근 BufferedImages (AWT)를 SWT Image Objects로 변환했습니다. 다음 스 니펫을 사용했습니다. java2s.com

코드가 시작될 수 있습니다. 또는 누군가 이미 IplImages를 BufferedImages로 변환 했으므로이 두 가지 변환 방법을 "파이프"처리 할 수 ​​있습니다.

건배

+0

그것은 버퍼 이미지에 AWT 이미지를 변환하는 것은 쉽다. IplImage 자체가 그렇게하는 방법을 제공합니다. 그러나 팀은 swt로 인해 다른 문제로 인해 스윙으로 전환하기로 결정하고 더 이상 이미지를 변환 할 필요가 없습니다 ... 도움을 주셔서 감사합니다! –

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*/ 
관련 문제