在SWTcanvas上显示IplImage(JavaCV)

我正在使用JavaCV进行大学项目。 它本质上是一个运动检测器。

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

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

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

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

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

干杯

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 { @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*/