JavaCV 从资源创建 Mat (InputStream)

标签 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. 对于具有透明 channel (即 32BPP)的 png 图像,它会移动 channel ,以便 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 对象转换过多。我觉得应该有一个简单有效的方法来做到这一点。

从资源创建 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 从资源创建 Mat (InputStream),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33442515/

相关文章:

使用 OpenCV/JavaCV 进行安卓人脸检测

opencv - 圆形和矩形的霍夫变换

java - 将 bean 放入 map 中,以按名称从工厂获取 bean

java - 安卓/Java : Problem with sending param and receiving JSON response with RetroFit in POST

嵌套 map 中的java迭代器(Map 2D)

python - 如何用python获取特定颜色(RGB)的像素坐标[x,y]列表?

python - Python中如何使用VIPS进行逻辑运算和逻辑索引?

java - 构造函数放在哪里?

android - 如何使用 OpenCV 在 Android 中调整图像亮度?

opencv - 使用javacv比opencv有什么优势?