Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaCV从资源创建Mat(InputStream)_Java_Image Processing_Javacv_Matchtemplate - Fatal编程技术网

JavaCV从资源创建Mat(InputStream)

JavaCV从资源创建Mat(InputStream),java,image-processing,javacv,matchtemplate,Java,Image Processing,Javacv,Matchtemplate,我使用JavaCV(不是OpenCV)。我的目标是从存储为资源的图像中获取Mat对象。然后我将把这个Mat传递到opencv\u imgproc.matchTemplate方法中。我成功地编写了这个糟糕的代码: InputStream in = getClass().getResourceAsStream("Lenna32.png"); BufferedImage image = ImageIO.read(in); Frame f = new Java2DFrameCon

我使用JavaCV(不是OpenCV)。我的目标是从存储为资源的图像中获取
Mat
对象。然后我将把这个
Mat
传递到
opencv\u imgproc.matchTemplate
方法中。我成功地编写了这个糟糕的代码:

    InputStream in = getClass().getResourceAsStream("Lenna32.png");
    BufferedImage image = ImageIO.read(in);
    Frame f = new Java2DFrameConverter().getFrame(image);
    Mat mat = new OpenCVFrameConverter.ToMat().convert(f);
这在某些情况下有效。问题是:

  • 对于具有透明度通道(即32BPP)的png图像,它会移动通道,使
    R=00g=33b=66a=FF
    变为
    R=33g=66b=FF

  • 在我的目标环境中,我无法使用
    ImageIO

  • 对象转换太多
    InputStream->BufferedImage->Frame->Mat
    。我觉得应该有一个简单有效的方法来做到这一点

  • 从资源创建Mat的最佳方法是什么?

    我通过从InputStream读取字节并将它们传递到imdecode函数来解决这个问题:

    InputStream is = context.getResourceAsStream("Lenna32.png");
    int nRead;
    byte[] data = new byte[16 * 1024];
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    while ((nRead = is.read(data, 0, data.length)) != -1) {
        buffer.write(data, 0, nRead);
    }
    byte[] bytes = buffer.toByteArray();
    Mat mat = imdecode(new Mat(bytes), CV_LOAD_IMAGE_UNCHANGED);
    

    如果您可以使用ApacheCommonsIO,那么您可以直接将输入流转换为一个字节数组,并使用IOUtils.toByteArray(is);。。。或者只需在kotlin中使用内置的
    inputStream.readAllBytes()
    扩展函数