JavaFX, Mat BufferedImage, OpenCV
Hi, I'm new to JavaFX and OpenCV. The Problem is, that JavaFX can't handle Mat objects. First I load an image as a BufferedImage. Then i have to convert this to Mat. Do my image Processing with OpenCV and again convert the result image to a BufferedImage to display in on my UI. Here are the methods for converting Buff to Mat and Mat to Buff I found on the internet:
public static Mat img2Mat(BufferedImage image)
{
byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
Mat mat = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3);
mat.put(0, 0, data);
return mat;
}
and
public static BufferedImage mat2Img(Mat mat) {
BufferedImage image = new BufferedImage(mat.width(), mat.height(), BufferedImage.TYPE_3BYTE_BGR);
WritableRaster raster = image.getRaster();
DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
byte[] data = dataBuffer.getData();
mat.get(0, 0, data);
return image;
}
Next I do some OpenCV stuff:
public static BufferedImage hello(BufferedImage img) {
Mat source = img2Mat(img); //Convert Buff to Mat
BufferedImage outImg = null;
try{
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
//Mat source = Highgui.imread("chart.png", Highgui.CV_LOAD_IMAGE_COLOR);
Mat destination = new Mat(source.rows(),source.cols(),source.type());
destination = source;
int erosion_size = 5;
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2*erosion_size + 1, 2*erosion_size+1));
Imgproc.erode(source, destination, element);
outImg = mat2Img(destination); //Convert Mat to Buff
}catch (Exception e) {
System.out.println("error: " + e.getMessage());
}
return outImg;
}
Finally I call the hello method in my controller:
void menuItemTestFired(ActionEvent event) {
try {
result = ImageProc.hallo(bImage);//bImage is an image I've loaded before.
imageView.setImage(SwingFXUtils.toFXImage(result, null));
Main.primary.sizeToScene();
} catch (Exception ex) {
ex.printStackTrace();
}
}
Unfortunately I get a lot of errors. Here are the first one:
Caused by: java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(III)J at org.opencv.core.Mat.n_Mat(Native Method) at org.opencv.core.Mat.<init>(Mat.java:471)
public Mat(int rows, int cols, int type) {
nativeObj = n_Mat(rows, cols, type);// This is th line 471
return;
}
at application.ImageProc.img2Mat(ImageProc.java:282) // 282 is the line NO.4 in the img2Mat method above.
at application.ImageProc.hallo(ImageProc.java:344) //344 is the line NO. 3 in the hello method above.
Can't figure out why this doesn't work. -.-
static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }