void ALImageTranscriber::waitForImage () { try { #ifdef DEBUG_IMAGE_REQUESTS printf("Requesting local image of size %ix%i, color space %i\n", IMAGE_WIDTH, IMAGE_HEIGHT, NAO_COLOR_SPACE); #endif ALImage *ALimage = NULL; // Attempt to retrieve the next image try { ALimage = (ALImage*) (camera->call<int>("getDirectRawImageLocal",lem_name)); }catch (ALError &e) { log->error("NaoMain", "Could not call the getImageLocal method of the " VIDEO_MODULE " module"); } if (ALimage != NULL) { memcpy(&image[0], ALimage->getFrame(), IMAGE_BYTE_SIZE); //image = ALimage->getFrame(); } else cout << "\tALImage from camera was null!!" << endl; #ifdef DEBUG_IMAGE_REQUESTS //You can get some informations of the image. int width = ALimage->fWidth; int height = ALimage->fHeight; int nbLayers = ALimage->fNbLayers; int colorSpace = ALimage->fColorSpace; long long timeStamp = ALimage->fTimeStamp; int seconds = (int)(timeStamp/1000000LL); printf("Retrieved an image of dimensions %ix%i, color space %i," "with %i layers and a time stamp of %is \n", width, height, colorSpace,nbLayers,seconds); #endif if (image != NULL) { // Update Sensors image pointer sensors->lockImage(); sensors->setImage(image); sensors->releaseImage(); } }catch (ALError &e) { log->error("NaoMain", "Caught an error in run():\n" + e.toString()); } }
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; };