Réponse acceptée !
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, "<init>", "(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;
}