OpenCV Java imshow()的实现

喜欢用OpenCV和Java的人往往会使用官网提供的OpenCV的包,OpenCV除了用于图像处理,本身也是一个优秀的数学库。而且对于Java而言,配置方便,编写容易,可扩展性也强。Java效率虽然低,但是核心计算部分仍然是C写的。
然而对于初学者来说,一个非常重要的函数——imshow(Mat m, string window)在Java中被阉割掉了,这使我们观察图像输出时只能通过imwrite()保存为图片后再查看,用起来非常不爽。因此,我动手自己实现了一个java类,实现了该函数以及waitKey(int time)两个函数,主要使用了java的swing框架,以及obj的wait()和notify()函数实现waitKey(int time)。其中,

函数名参数功能
ImageGui(Mat m, String window)要显示的图像和窗口名构造
ig.imshow()显示图片
ig.waitKey(int time);需要暂停的毫秒数参数为0则阻塞线程且等待用户输入,不为0则等待指定毫秒数后继续运行,并返回键盘输入值

实现效果如下。
这里写图片描述
是不是和C++中的imshow()一样好用呢?
下面是源码。
1. ImageGui.java

package com.meng.highgui;

import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.python.modules.synchronize;
/**
 * An Gui extention for opencv3.0 using Swing, which can't display images in java.
 * @author Dechao
 * 
 * Description:
 * 
 * examples:
 *  System.loadLibrary("opencv_java300");  
 *  Mat mat = Mat.eye(1000, 2000, CvType.CV_8UC3);
 *  String window_name = "mat"
 *  ImageGui ig = new ImageGui(mat,window_name);
 *  ig.imshow();
 *  ig.waitKey(0);
 *
 */
public class ImageGui extends JPanel implements KeyListener {


    public ImageGui(Mat m, String window) {
        super();
        init(m, window);
    }

    //Elements for paint.
    private Mat mat;
    private boolean firstPaint = true; 
    private BufferedImage out;
    int type;
    private String WINDOW = ""; 
    private JFrame jframe = new JFrame();        
    byte[] data;
    private void Mat2BufIm(){               
        mat.get(0, 0, data);
        out.getRaster().setDataElements(0, 0, mat.cols(), mat.rows(), data);
    }
    private void init(Mat m,String window){
        this.mat = m;
        data = new byte[mat.cols() * mat.rows() * (int)mat.elemSize()];

        WINDOW = window;

        if(mat.channels() == 1)
            type = BufferedImage.TYPE_BYTE_GRAY;
        else
            type = BufferedImage.TYPE_3BYTE_BGR;
        out = new BufferedImage(mat.cols(), mat.rows(), type);
        Mat2BufIm();    
        jframe.add(this);  
        jframe.setSize(mat.cols(), mat.rows());  
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        jframe.setTitle(WINDOW);
        jframe.addKeyListener(this);

    }
    @Override  
    public void paintComponent(Graphics g) {  
            g.drawImage(out, 0, 0, null);   
        }
    public void imshow(){
        if(firstPaint){
            jframe.setVisible(true); 
            firstPaint = false;
            }
        Mat2BufIm();
        this.repaint();
    }








    //Elements for waitKey.
    private static Object mt = new Object();
    private static int lastKey = 0;
    private static int key = 0;
    public static int waitKey(int millisecond){
        //TODO 实现监听键盘
        try {
            if(millisecond == 0){
                synchronized(mt){
                    mt.wait();
                }


                }
            Thread.sleep(millisecond);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        int ret = -1;
        if(key != lastKey){
            ret = key;
            lastKey = key;          
        }

        return ret;

    }
    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
//      System.out.println(e.getKeyChar() + ", " + e.getKeyCode()
//                + ", " + KeyEvent.getKeyText(e.getKeyCode())
//                + ", isActionKey: " + e.isActionKey());
        synchronized(mt){
            mt.notifyAll();
        }
        this.key = e.getKeyCode();

    }
    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }  


}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值