OOP Probleme beim Funktionsaufruf, Java OpenCV

Mark22

Mitglied
Hallo,
hänge gerade am folgenden Problem fest. Der Code hier funktioniert einwandfrei (sofern man eine jpg-Datei benutzt. Das ist aber eine andere Geschichte). In der Zeile 20-22 wird das BufferedImage Objekt in ein Mat um gewandelt (Mat ist ein OpenCV spezifisches Objekt zum laden von Bildern). Anschließend werden Funktionen der OpenCV aufgerufen und in der Zeile 27-30 wird das Mat wieder in ein BufferedImage überführt.

Java:
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;


public class Main {
   public static void main( String[] args ){
   
      try {
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("20150113_122621.jpg",
         Highgui.CV_LOAD_IMAGE_COLOR);
         
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         Imgproc.GaussianBlur(source, destination,new Size(45,45), 0);
         Highgui.imwrite("Gaussian45.jpg", destination);
      
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}
Ich habe den Code aus den Zeilen 20-22 und 27-30 übernommen und mir daraus paar Funktionen gebastelt:
Java:
public static Mat img2Mat(BufferedImage image)
  {
		//BufferedImage image = myBufferedImage;
		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;
   }
und
Java:
public static BufferedImage mat2Img(Mat mat1) {
		
		 byte[] data1 = new byte[mat1.rows() * mat1.cols() * (int)(mat1.elemSize())];
         mat1.get(0, 0, data1);
         BufferedImage image1 = new BufferedImage(mat1.cols(),mat1.rows(), BufferedImage.TYPE_BYTE_GRAY);
         image1.getRaster().setDataElements(0, 0, mat1.cols(), mat1.rows(), data1);
		return image1;
	}
Also genau das Gleiche.
Die Bildverarbeitungsoperationen aus OpenCV habe ich ebenfalls in eine separate Funktion gepackt:
Java:
static public BufferedImage hello(BufferedImage img){
	  
	 Mat source = img2Mat(img);
	 BufferedImage result=null;

	  try{
	         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
	         Mat destination = new Mat(source.rows(),source.cols(),source.type());
	         Imgproc.GaussianBlur(source, destination, new Size(0,0), 10);
	         Core.addWeighted(source, 1.5, destination, -0.5, 0, destination);
	         
	         result = mat2Img(destination);

	      }catch (Exception e) {
	      }
	  return result;
	  }
Für die Konvertierung rufe ich die beiden Funktionen img2Mat() und mat2Img() auf.
In der main lade ich mir ein Bild und packe es in die hello Funktion rein.
Java:
  public static void main(String[] args) {
	  
	  try {
                        BufferedImage bImage=null;

			bImage = ImageIO.read(new File("20150113_122621.jpg"));
		} catch (IOException e) {
		}
	
	  
	  hello(bImage);
  }

Wenn ich nun den Code ausführe, bekomme ich Fehlermeldungen in folgender Reihenfolge: Zeile 4 in der mat2Img() Methode, in der Zeile 3 in der hello-Methode und in der Zeile 11 in der main. Also wo ich die hello-Methode aufrufe.
Der Fehler liegt anscheinend in der mat2Img() Methode.
Ich versteht das nicht. Im Grude mache ich doch das Gleiche wie im ersten Codeblock, nur anderes hingeschrieben. :bahnhof:
Hoffe ihr könnt mir da weiterhelfen!
 

Zurück
Oben