Gui Swing + jni c++ (OpenCv)

Résolu
co2_gaz Messages postés 29 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 14 septembre 2009 - 18 nov. 2008 à 11:30
benmor Messages postés 49 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 27 novembre 2011 - 14 sept. 2009 à 16:33
bonjour,


je dois écrire un programme en <layer id="google-toolbar-hilite-4" style="background-color: Fuchsia; color: black;"><layer id="google-toolbar-hilite-0" style="background-color: Yellow; color: black;">java</layer></layer> pour faire du traitement d'images et de vidéos. les interface graphique en <layer id="google-toolbar-hilite-3" style="background-color: Cyan; color: black;">swing</layer> c'est OK, mais pour les traitements il y a <layer id="google-toolbar-hilite-14" style="background-color: Chartreuse; color: black;"><layer id="google-toolbar-hilite-5" style="background-color: Fuchsia; color: black;">OpenCv</layer></layer> (en C++) qui est vraiment imbattable.

Mon problème c'est que avec <layer id="google-toolbar-hilite-15" style="background-color: Chartreuse; color: black;"><layer id="google-toolbar-hilite-6" style="background-color: Fuchsia; color: black;">OpenCv</layer></layer>
je peut récupérer une frame dans laquelle s'affiche la vidéo et son
traitement, mais je sais pas si on peut la combiner avec du GUI <layer id="google-toolbar-hilite-4" style="background-color: Cyan; color: black;">swing</layer>
et si oui comment?

3 réponses

co2_gaz Messages postés 29 Date d'inscription samedi 21 octobre 2006 Statut Membre Dernière intervention 14 septembre 2009
14 sept. 2009 à 15:08
Bonjour,
Je viens de voir ton message,
J'ai wrapper vers opencv en utilisant JNI
tu peux voir ici http://www.ibm.com/developerworks/java/library/j-jni/
La solution est transmettre le tableau IplImage->data ( qui est un tableau de int) vers java puis créer avec un BufferedImage (on peut aussi créer la BI au niveau c/c++ et transmettre sa référence à JAVA).
exemple :

(en fin du compte j'ai du copié les images de java (JMF plus de formats), puis traitement, puis retransmission des résultats pour affichage dans la gui swing )

//////////////// copie d'une BI vers un buffer IplImage
/*
* Class: core_cv_Opencv
* Method: copy
* Signature: ([II)J
*/
JNIEXPORT jlong JNICALL Java_core_cv_Opencv_copy
(JNIEnv * jenv, jobject jobj, jintArray pixels, jint step){


IplImage * buffer;

// access pixel's values and
// check in case the VM tried to make a copy.
int * data = (int*) jenv->GetPrimitiveArrayCritical( pixels, 0 );
if ( data==NULL ) cout << "out of memory" << endl;

// data length
int srcsize = (int) jenv->GetArrayLength( pixels );


// the destination region size
int size = step*(srcsize/step);



// scaled image
buffer = cvCreateImage( cvSize(step,srcsize/step), IPL_DEPTH_8U, 3);


// add data
for( int i=0; i<size; i++ )
{
int x = i%step;
int y = i/step;

// retrieve scaled source and destination pixel's index
int srci = x+(y*step);
int desti = ( x*buffer->nChannels )+( y*buffer->widthStep );

// get RGB values
unsigned char b = data[ srci ] & 0xff;
unsigned char g = data[ srci ] >> 8 & 0xff;
unsigned char r = data[ srci ] >> 16 & 0xff;

// set RGB pixel's value
buffer->imageData[ desti ] = b;
buffer->imageData[ desti+1 ] = g;
buffer->imageData[ desti+2 ] = r;

}



jenv->ReleasePrimitiveArrayCritical( pixels, data, 0 );

return (long)buffer;

}


/////////////////////// utilisation objets java en C/C++


/*
* Class: core_cv_Opencv
* Method: detect
* Signature: (JFIIII)[Ljava/awt/Rectangle;
*/
JNIEXPORT jobjectArray JNICALL Java_core_cv_Opencv_detect
(JNIEnv * jenv, jobject jobj, jlong ptr,
jfloat scale, jint neighbors, jint flags, jint w, jint h){

// Find the Java Rectangle class object and constructor method
jclass clsRectangle = jenv->FindClass( "java/awt/Rectangle" );
jmethodID methodConstruct = jenv->GetMethodID( clsRectangle, "", "(IIII)V" );

// create an empty output list for errors
jobjectArray out = jenv->NewObjectArray( 0, clsRectangle, NULL );

IplImage* image = (IplImage*)ptr;


storage = cvCreateMemStorage(0);

// nothing to do without this elements
// -> exit
if ( !image ){cerr<< "!cpp image null " <<endl; return out;}
if ( !frontCascade ){cerr<< " !cpp cascade null" <<endl; return out;}
if ( !storage ){cerr<< " !cpp storage null" <<endl; return out;}


// there can be more than one face in an image -> create a growable sequence of faces.
// detect the objects and store them in the sequence
CvSeq * frontFaces = cvHaarDetectObjects(
image,
frontCascade,
storage,
(double) scale,
(int) neighbors,
(int) flags,
cvSize( (int)w, (int)h )
);





// define output list length
out = jenv->NewObjectArray(frontFaces->total, clsRectangle, NULL );

// convert each face rectangle
for( int i=0; i<frontFaces->total; i++ ) {
// define face rectangle
CvRect * rect = (CvRect*) cvGetSeqElem( frontFaces, i );
// Construct a new Java Rectangle
jobject elem = jenv->NewObject( clsRectangle, methodConstruct, rect->x, rect->y, rect->width, rect->height );
// place the new elemnt in the output list
jenv->SetObjectArrayElement( out, i, elem );
}

// clear the memory storage
//cvClearMemStorage(storage );
cvReleaseMemStorage(&storage);

// return the result
return out;


}
3
benmor Messages postés 49 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 27 novembre 2011 9
14 sept. 2009 à 14:13
Bonjour co2_gaz,

Si tu as fini par trouver la solution à ton problème, cela pourrait peut être m'intéresser aussi.

Merci,
Benoit MOREAU.
0
benmor Messages postés 49 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 27 novembre 2011 9
14 sept. 2009 à 16:33
Merci beaucoup, cela pourra très certainement m'aider.
0
Rejoignez-nous