Das Konvertieren einer OpenCV-Matte in ein JavaFX-Bild funktioniert nicht, wenn ByteBuffer und PixelFormat verwendet werJava

Java-Forum
Anonymous
 Das Konvertieren einer OpenCV-Matte in ein JavaFX-Bild funktioniert nicht, wenn ByteBuffer und PixelFormat verwendet wer

Post by Anonymous »

Ich habe eine Frage gepostet, welcher der beiden Ansätze effizienter ist, um ein OpenCV-Mattenobjekt in ein JavaFXML-Bild zu konvertieren, damit es später in der Anwendung angezeigt werden kann.
In den meisten Kommentaren wurde die Verwendung von PixelBuffer zum Erstellen eines beschreibbaren Bildes vorgeschlagen.
Zu diesem Zweck habe ich den Vorschlag von @James_D gewählt, der lautet:

Mat -> MatOfByte -> byte[] -> ByteBuffer -> PixelBuffer -> WritableImage

So sieht der Code aus:

Code: Select all

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;
import java.nio.ByteBuffer;

import javafx.concurrent.Task;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.image.Image;
import javafx.scene.image.PixelBuffer;
import javafx.scene.image.PixelFormat;
import javafx.scene.image.WritableImage;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

public class MatToFXImage extends Task {
private final Mat mat;

public MatToFXImage(Mat mat) {
if (mat == null)
throw new IllegalArgumentException("Mat object can't be null");

this.mat = mat;
}

private int determineImageType(int matType) {
if (matType == CvType.CV_8UC1)
return BufferedImage.TYPE_BYTE_GRAY;
else if (matType == CvType.CV_8UC3)
return BufferedImage.TYPE_3BYTE_BGR;
else
throw new IllegalArgumentException("Unsupported Mat type: " + matType);
}

@Override
protected Image call() {
// MatOfByte byteMat = new MatOfByte();
// Imgcodecs.imencode(".bmp", mat, byteMat);
// return new Image(new ByteArrayInputStream(byteMat.toArray()));

int size = (int) (mat.total() * mat.channels());
byte[] byteArray = new byte[size];

mat.get(0, 0, byteArray);

ByteBuffer buffer = ByteBuffer.wrap(byteArray);
PixelFormat pixelFormat = PixelFormat.getByteBgraPreInstance();
PixelBuffer pixelBuffer = new PixelBuffer(mat.width(), mat.height(), buffer, pixelFormat);

return new WritableImage(pixelBuffer);

// int type;

// type = determineImageType(mat.type());

// BufferedImage image = new BufferedImage(mat.width(), mat.height(), type);
// WritableRaster raster = image.getRaster();
// DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();

// // byte[] data = dataBuffer.getData();

// mat.get(0, 0, dataBuffer.getData());
// return SwingFXUtils.toFXImage(image, null);
}
}
Ich würde gerne wissen, warum es nicht wie vorgesehen funktioniert

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post