Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
I use JavaCV (not OpenCV). My goal is to obtain a
Mat
object from an image that is stored as a Resource. Then I'm going to pass this
Mat
into
opencv_imgproc.matchTemplate
method. I've managed to write this
bad
code:
InputStream in = getClass().getResourceAsStream("Lenna32.png");
BufferedImage image = ImageIO.read(in);
Frame f = new Java2DFrameConverter().getFrame(image);
Mat mat = new OpenCVFrameConverter.ToMat().convert(f);
This works in some cases. The problems are:
For png images that has transparency channel (that is 32BPP), it shifts channels, so that R=00 G=33 B=66 A=FF
turns to R=33 G=66 B=FF
On my target environment, I can't use ImageIO
There are too many object conversions InputStream -> BufferedImage -> Frame -> Mat
. I feel like there should be a simple and effective way to do this.
What is the best way to create Mat from a Resource?
I resolved this by reading bytes from InputStream and passing them into imdecode function:
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);
–
Just for reference, in order to convert InputStream to Mat, @Kotlin:
val bytes = inputStream.readBytes()
val mat = Mat(1, bytes.size, CvType.CV_8UC1)
mat.put(0, 0, bytes)
return Imgcodecs.imdecode(mat, Imgcodecs.IMREAD_UNCHANGED)
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.