opencv Java构建中imshow的等效方法

Posted

技术标签:

【中文标题】opencv Java构建中imshow的等效方法【英文标题】:Equivalent method for imshow in opencv Java build 【发布时间】:2013-05-05 21:14:39 【问题描述】:

对不起,如果我问了一个愚蠢的问题,我正在尝试使用 Java 构建来学习 openCV。在 opencv 示例中,我发现 c++ 中有 imshow 方法或 python 中有 showImage 方法,但我在 opencv Java API 中搜索,我找不到 imshow 方法。

opencv与Java build中imshow()和waitKey()的equal方法是什么?

【问题讨论】:

【参考方案1】:
public static void showResult(Mat img) 
    Imgproc.resize(img, img, new Size(640, 480));
    MatOfByte matOfByte = new MatOfByte();
    Highgui.imencode(".jpg", img, matOfByte);
    byte[] byteArray = matOfByte.toArray();
    BufferedImage bufImage = null;
    try 
        InputStream in = new ByteArrayInputStream(byteArray);
        bufImage = ImageIO.read(in);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        frame.getContentPane().add(new JLabel(new ImageIcon(bufImage)));
        frame.pack();
        frame.setVisible(true);
     catch (Exception e) 
        e.printStackTrace();
    

【讨论】:

Java 3.0 中没有更多的HighGUI 模块,不再使用Imgcodecs insead【参考方案2】:

目前还没有 Java highgui 包装器 (link)。您应该使用 swing 或 swt 来显示图像。见:Opencv java - Load image to GUI

【讨论】:

非常感谢解答,waitKey方法呢?和thread.sleep一样吗? 我明白了,呃,还有一件事,您知道如何启动网络摄像头并从中获取实时信息。我的意思是,到目前为止,我设法通过网络摄像头捕捉我的脸并检测它,现在我想做的是打开我的网络摄像头并检测我的脸而不捕捉它,就像这样youtube.com/watch?v=HTk_UwAYzVk【参考方案3】:

这是在 Java OpenCV 中等效于 Imshow() 的现成解决方案 它使用简单。 API 将如下所示:

Imshow im = new Imshow("Title");

im.showImage(matimage);

访问这里 https://github.com/master-atul/ImShow-Java-OpenCV

【讨论】:

【参考方案4】:

我用 swing 和 awt 做了一些东西。

首先,通过 imencodeImageIo.read 从 Mat img 获取 BufferedImage

        MatOfByte mMatOfByte = new MatOfByte()
        imencode(".png", img, mMatOfByte);
        byte[] byteArray = mMatOfByte.toArray();
        InputStream in = new ByteArrayInputStream(byteArray);
        BufferedImage srcImage = ImageIO.read(in);

其次,将其更改为目标尺寸宽度和高度(w,h)并使用渲染提示在扩大或缩小情况下获得干净的图像。

            bufImage = new BufferedImage(w, h, srcImage.getType());
            Graphics2D g = bufImage.createGraphics();
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(srcImage, 0,0, w, h, 0, 0, srcImage.getWidth(), srcImage.getHeight(), null);

我在 JPanel 的 paintComponent() 方法中使用了目标 bufImage

对于waitKey(),我使用了KeyEventDispatcher

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 感谢 Tom Aranda 的评论。我重写了我的内容。 这是一个显着的改进。 :)【参考方案5】:

你必须使用 java swings 或 awt 来显示图像..看看运行代码http://projectimageprocessing.blogspot.in/2013/05/introduction.html

【讨论】:

以上是关于opencv Java构建中imshow的等效方法的主要内容,如果未能解决你的问题,请参考以下文章

在opencv中使用imshow显示字节数组的最快方法是啥?

Opencv - 如何使用与多个线程共享的 imshow() 方法相同的窗口

在 Java OpenCV 中替换像素的等效代码

什么是Scala等效于Java构建器模式?

opencv imshow()

C# EmguCV Image.setValue(...) 方法的 C++ OpenCV 等效项