java - 在 SWT Canvas 上显示 IplImage (JavaCV)

标签 java image opencv swt

我正在将 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/

相关文章:

java - 如何在java中反转不可修改的列表

java - 如何在 Spring 中删除身份验证请求?

c# - 如何从 Canvas 中的隐藏代码打开图像并让用户在此图像上绘图

jquery - 单击全屏图库

java - Android 中的服务器-客户端故障(套接字未绑定(bind)/套接字已在使用中)

java - Maven:一种跳过选定站点部署问题管理的方法

java - 在不影响纵横比的情况下调整图像大小

opencv - 使用OpenCV进行手语翻译

OpenCV 将 Logo 添加到感兴趣的区域

.net - 使用我自己的插件Dll文件时Unity3D出现奇怪的错误