我正在将 JavaCV 用于大学项目。它本质上是一个运动检测器。
我使用 OpenCVFrameGrabber 类从网络摄像头获取帧,我想在我的 GUI 上显示抓取的帧。
我正在使用 SWT,我认为将框架显示到 Canvas 组件中会很好。 我有一个问题,因为 OpenCVFrameGrabber 提供图像作为 IplImage 类的实例,而 SWT 使用 org.eclipse.swt.graphics.Image 图像类。
所以我应该以某种方式将图像从 IplImage 转换为 SWT Image。执行此操作的最佳方法是什么?
最佳答案
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*/
关于java - 在 SWT Canvas 上显示 IplImage (JavaCV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5372785/