JavaCV从资源创建Mat(InputStream)

时间:2015-10-30 18:18:58

标签: java image-processing javacv matchtemplate

我使用JavaCV(不是OpenCV)。我的目标是从存储为资源的图像中获取Mat对象。然后,我将Mat传递给opencv_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);

这适用于一些案例。问题是:

  1. 对于具有透明度通道(即32BPP)的png图像,它会移动频道,以便R=00 G=33 B=66 A=FF变为R=33 G=66 B=FF Lenna 32BPP color shift

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

  3. 对象转换次数过多InputStream -> BufferedImage -> Frame -> Mat。我觉得应该有一种简单有效的方法来做到这一点。
  4. 从资源创建Mat的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我通过从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);