JavaCV从资源创建Mat(InputStream)
我使用JavaCV(不是OpenCV)。我的目标是从存储为资源的图像中获取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
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);
这在某些情况下有效。问题是:
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()
扩展函数