繁体   English   中英

JavaCV从资源创建Mat(InputStream)

[英]JavaCV Create Mat from Resource (InputStream)

我使用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 莱娜32BPP色偏

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

  3. 对象转换太多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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM