/** * saveImageRemote : test remote image * @param pName path of the file */ void vision::testRemote(){ //Now you can get the pointer to the video structure. ALValue results; results.arraySetSize(7); try { results = ( camera->call<ALValue>( "getImageRemote", name ) ); }catch( ALError& e) { log->error( "vision", "could not call the getImageRemote method of the NaoCam module" ); } if (results.getType()!= ALValue::TypeArray) return; const char* dataPointerIn = static_cast<const char*>(results[6].GetBinary()); int size = results[6].getSize(); //You can get some informations of the image. int width = (int) results[0]; int height = (int) results[1]; int nbLayers = (int) results[2]; int colorSpace = (int) results[3]; long long timeStamp = ((long long)(int)results[4])*1000000LL + ((long long)(int)results[5]); // now you create an openCV image and you save it in a file. IplImage* image = cvCreateImage( cvSize( width, height ), 8, nbLayers ); // image->imageData = ( char* ) imageIn->getFrame(); image->imageData = ( char* ) dataPointerIn; std::string pName = "aaa"; //const char* imageName = ( pName + DecToString(results[4]) + ".jpg").c_str(); const char* imageName = ( pName + "test" + ".jpg").c_str(); printf("imageName %s\n", imageName); cvSaveImage( imageName, image ); printf("image saved\n"); try { results = ( camera->call<ALValue>( "releaseImage", name ) ); }catch( ALError& e) { log->error( "vision", "could not call the releaseImage method of the NaoCam module" ); } printf("image memory released\n"); // cvReleaseImage( &image ); cvReleaseImageHeader(&image); printf("image released\n"); printf("testRemote finished\n"); }
struct timespec KImageExtractor::fetchImage(IplImage *img) { struct timespec rt;//Timestamp cout<<"KImageExtractor::fetchimage():"<<endl; if (doneSubscribe==false) { cout<<"KImageExtractor: Warning! fetchImage() called although GVM Subscription has failed!"<<endl; rt.tv_sec=0; rt.tv_nsec=0; return rt; } #ifdef REMOTE_ON // cout << "Remote method on" << endl; // sleep(1); ALValue results; #ifdef RAW results = (c->call<ALValue> ("getDirectRawImageRemote", GVM_name)); #else results = (c->call<ALValue> ("getImageRemote", GVM_name)); #endif if (results.getType() != ALValue::TypeArray && results.getSize() != 7) { throw ALError("KImageExtractor", "saveImageRemote", "Invalid image returned."); } //const int size = results[6].getSize(); // You can get some image information that you may find useful. // const int width = (int) results[0]; // const int height = (int) results[1]; // const int nbLayers = (int) results[2]; // const int colorSpace = (int) results[3]; //const long long timeStamp = ((long long) (int) results[4]) * 1000000LL + ((long long) (int) results[5]); // const int seconds = (int) (timeStamp / 1000000LL); // Set the buffer we received to our IplImage header. //fIplImageHeader->imageData = (char*) (results[6].GetBinary()); //cout << "Size" << size << endl; int width = (int) results[0]; int height = (int) results[1]; int nChannels = (int) results[2]; int colorSpace = (int) results[3]; int size =width*height*nChannels; //Fetch TimeStamp; rt.tv_sec=(time_t)((int) results[4]); rt.tv_nsec=(int) results[5]*1000L; //Change of image data size assert(img!=NULL); //cout<<img->imageSize<<" "<<size<<endl; if (img->imageSize!=size ) { //cout<<img->width<<" "<<img->height<<endl; cout<<"KImageExtractor::fetchImage():allocating new imagedata"<<endl; //cout<<"Delete old"<<endl; //delete img->imageData; //img->imageData=NULL; cout<<"cvInitImage"<<endl; cvInitImageHeader(img, cvSize(width,height),IPL_DEPTH_8U, nChannels); //img->imageData=NULL; cout<<" Done"<<endl; //img->imageData=(char*)malloc(img->imageSize); } if (img->imageData != NULL) { //free( fIplImageHeader->imageData) memcpy(img->imageData, (char*) (results[6].GetBinary()), results[6].getSize() * sizeof(unsigned char)); } else { img->imageData = new char[img->imageSize]; memcpy(img->imageData, (char*) (results[6].GetBinary()), results[6].getSize() * sizeof(char)); } #else //cout << "Remote method off" << endl; //sleep(1); ALImage* imageIn = NULL; // Now you can get the pointer to the video structure. #ifdef RAW imageIn = (ALImage*) (c->call<int> ("getDirectRawImage", GVM_name)); #else imageIn = (ALImage*) (c->call<int> ("getImageLocal", GVM_name)); #endif if (!imageIn) { throw ALError("KImageExtractor", "saveImageLocal", "Invalid image returned."); } //fLogProxy->info(getName(), imageIn->toString()); // You can get some image information that you may find useful. int width = imageIn->fWidth; int height = imageIn->fHeight; const int nChannels = imageIn->fNbLayers; // const int colorSpace = imageIn->fColorSpace; const long long timeStamp = imageIn->fTimeStamp; // const int seconds = (int) (timeStamp / 1000000LL); const int size = width*height*nChannels; // Set the buffer we received to our IplImage header. //Fetch TimeStamp; rt.tv_sec=(time_t) (timeStamp / 1000000LL); rt.tv_nsec=(long) ((timeStamp-rt.tv_sec*1LL)*1000LL); //Change of image data size if (img->imageSize!=size*sizeof(char) ) { free(img->imageData); cvInitImageHeader(img, cvSize(width,height),IPL_DEPTH_8U, nChannels); img->imageData=NULL; //img->imageData=(char*)malloc(img->imageSize); } if (img->imageData!=NULL) { //free( fIplImageHeader->imageData); memcpy ( img->imageData, (char*) imageIn->getFrame(), size*sizeof(char) ); } else { img->imageData = new char[size]; memcpy ( img->imageData, (char*) imageIn->getFrame(), size*sizeof(char) ); } //fIplImageHeader->imageData = (char*) imageIn->getFrame(); //saveIplImage(fIplImageHeader, name, pImageFormat, seconds); // Now that you're done with the (local) image, you have to release it from the V.I.M. c->call<int> ("releaseImage", GVM_name); #endif return rt; };