JavaCV 从资源(InputStream)创建 Mat
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);
这在一些 情况下有效。问题是:
对于有透明通道(即32BPP)的png图片,它会移动通道,使R=00 G=33 B=66 A=FF
变为R=33 G=66 B=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);
我使用 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);
这在一些 情况下有效。问题是:
对于有透明通道(即32BPP)的png图片,它会移动通道,使
R=00 G=33 B=66 A=FF
变为R=33 G=66 B=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);