V
Vorby
Gast
Guten Tag ihr lieben
um erstmal mein porblem zu schildern, vorweg was ich vor habe.
ich habe ein Java Programm erstellt, womit ich ein JPG file einlesen kann - diese File wird dann gespeichert in RGB-werten (Arrays) [Es wir auch angezeigt (JFrame)]
Weiterhin möchte ich das Bild (Arrays) weiter bearbeiten.
Dafür eignet sich openCV recht gut. Die nahliegendste Möglichkeit OpenCV und Java zusammenzubringen ist jni?!
Am anfang habe ich nur mit c++ das bild Heller/Dunkler gemacht. Einfach Array werte plus oder minus einen Betrag.
In OpenCV ist diese sache schon impl. -> Bsp: cvConvertScale( InImg, OutImg, 1, S1_Value);
So nun mal zu meinem Problem:
Dieses ist mein Bild in Java:
der Nativer aufruf lautet:
JNIEXPORT void JNICALL Java_NewJFrame_CThresholdSegmentationInv
(JNIEnv* env, jobject thisObj, jobject Image, jfloat h){
Mein Objekt ist einmal das Bild (in C1 C2 C3 = RGB) und der float-wert (floar für änderung der Helligkeit)
...es ist kein Thema die C1 C2 C3 etc. Werte Auszulesen
in der CPP file steht folgendes:
mein Problem ist nun!
cvConvertScale von OpenCV erwartet den Typ - *IplImage
Bsp.:
IplImage *Image;
dann kann man nämlich Image->height; Image->width; aufrufen
also ein Zeiger auf Höhe / Breite und auch dem Array mit den Information über das Bidl (Pixel)
ich dagegen kann nur in meiner CPP habe nur Höhe / Breite direkt in in einem Int wert (bzw jint)
Wie kann ich den gleich Typ (evtl aus Java) direkt "übergeben". Oder kann ich mir den in C Basteln?
so das ich z.b. den aufruf cvConvertScale( (*IplImage)InImg,(*IplImage)OutImg, 1, S1_Value); casten kann.
Ich habe schon versucht, einfach in dem CPP-File:
IplImage *Image;
und dann Image->height=(int)Height; //aber hier schmiert mir dann schon Java ab nach aufruf der dll
kann ich keine neuen Objekte erzugen? so als Übergangslösung?
Ich hoffe es ist versändlich was ich hier will
Ansonsten gern noch mal nachfragen.
Bedanken möchte ich mich jetzt schon ganz gerne, bei allen die sich mit dem Thema auseinandersetzen.
um erstmal mein porblem zu schildern, vorweg was ich vor habe.
ich habe ein Java Programm erstellt, womit ich ein JPG file einlesen kann - diese File wird dann gespeichert in RGB-werten (Arrays) [Es wir auch angezeigt (JFrame)]
Weiterhin möchte ich das Bild (Arrays) weiter bearbeiten.
Dafür eignet sich openCV recht gut. Die nahliegendste Möglichkeit OpenCV und Java zusammenzubringen ist jni?!
Am anfang habe ich nur mit c++ das bild Heller/Dunkler gemacht. Einfach Array werte plus oder minus einen Betrag.
In OpenCV ist diese sache schon impl. -> Bsp: cvConvertScale( InImg, OutImg, 1, S1_Value);
So nun mal zu meinem Problem:
Dieses ist mein Bild in Java:
Code:
public class ColorImage {
public int Width = 0;
public int Height = 0;
public int ColorType = 0; // 0 - RGB, 1 - YCrCb, 2 - HSV
public float C1[]; // R; Y; H
public float C2[]; // G; Cr; S
public float C3[]; // B; Cb; V
public float Mask[];
/** Creates a new instance of ColorImage */
public ColorImage() { }
public ColorImage(int w, int h) {
C1 = new float[w * h];
C2 = new float[w * h];
C3 = new float[w * h];
Mask = new float[w * h];
Width = w;
Height = h;
ColorType = 0;
}
}
der Nativer aufruf lautet:
JNIEXPORT void JNICALL Java_NewJFrame_CThresholdSegmentationInv
(JNIEnv* env, jobject thisObj, jobject Image, jfloat h){
Mein Objekt ist einmal das Bild (in C1 C2 C3 = RGB) und der float-wert (floar für änderung der Helligkeit)
...es ist kein Thema die C1 C2 C3 etc. Werte Auszulesen
in der CPP file steht folgendes:
Code:
// Klasse bestimmen
jclass image = env->GetObjectClass(Image);
// get Field-IDs
jfieldID C1_fid = env->GetFieldID(image, "C1", "[F"); // "[" bedeutet ein Feld / "F" ist ein Float
jfieldID C2_fid = env->GetFieldID(image, "C2", "[F");
jfieldID C3_fid = env->GetFieldID(image, "C3", "[F");
//RGB C1 C2 C3
// get C1 from Image
jfloatArray c1 = (jfloatArray)(env->GetObjectField(Image, C1_fid)); // cast jintArray from jObject !!!!
jfloat* C1 = env->GetFloatArrayElements(c1, &isCopyC1); // get the array (copy)
// get C2 from Image
jfloatArray c2 = (jfloatArray)(env->GetObjectField(Image, C2_fid)); // cast jintArray from jObject !!!!
jfloat* C2 = env->GetFloatArrayElements(c2, &isCopyC2); // get the array (copy)
// get C3 from Image
jfloatArray c3 = (jfloatArray)(env->GetObjectField(Image, C3_fid)); // cast jintArray from jObject !!!!
jfloat* C3 = env->GetFloatArrayElements(c3, &isCopyC3); // get the array (copy)
// get Width from Image
jint Width = env->GetIntField(Image, env->GetFieldID(image, "Width", "I"));
// get Height from Image
jint Height = env->GetIntField(Image, env->GetFieldID(image, "Height", "I"));
mein Problem ist nun!
cvConvertScale von OpenCV erwartet den Typ - *IplImage
Bsp.:
IplImage *Image;
dann kann man nämlich Image->height; Image->width; aufrufen
also ein Zeiger auf Höhe / Breite und auch dem Array mit den Information über das Bidl (Pixel)
ich dagegen kann nur in meiner CPP habe nur Höhe / Breite direkt in in einem Int wert (bzw jint)
Wie kann ich den gleich Typ (evtl aus Java) direkt "übergeben". Oder kann ich mir den in C Basteln?
so das ich z.b. den aufruf cvConvertScale( (*IplImage)InImg,(*IplImage)OutImg, 1, S1_Value); casten kann.
Ich habe schon versucht, einfach in dem CPP-File:
IplImage *Image;
und dann Image->height=(int)Height; //aber hier schmiert mir dann schon Java ab nach aufruf der dll
kann ich keine neuen Objekte erzugen? so als Übergangslösung?
Ich hoffe es ist versändlich was ich hier will
Ansonsten gern noch mal nachfragen.
Bedanken möchte ich mich jetzt schon ganz gerne, bei allen die sich mit dem Thema auseinandersetzen.