diff --git a/src/bumblebee.cpp b/src/bumblebee.cpp index 6cbcfe5d1775ae4b3550765e2d796728651b139f..b09249ad79406f1b79555bf083da4b999619a014 100755 --- a/src/bumblebee.cpp +++ b/src/bumblebee.cpp @@ -58,13 +58,25 @@ void CBumblebee::set_config(unsigned int *left_off,unsigned int *top_off,unsigne } this->mode=DC1394_VIDEO_MODE_FORMAT7_3; // configure the camera - if(this->stereo_coding==MONO) + if(this->stereo_coding==MONO)// the image sensor is mono { this->coding=MONO; dc1394_coding=DC1394_COLOR_CODING_MONO16; } - else + else// the image sensor is color { + if(coding==RAW)// the desired coding is RAW + { + this->stereo_depth=DEPTH8; + this->stereo_coding=RAW; + } + else if(coding==RGB) + { + this->stereo_depth=DEPTH24; + this->stereo_coding=RGB; + } + else + throw CFirewireCameraException(_HERE_,"Invalid color coding"); this->coding=RAW; dc1394_coding=DC1394_COLOR_CODING_RAW16; } @@ -194,7 +206,7 @@ void CBumblebee::get_stereo_image(char **left,char **right) } else { - depth = (int)ceil((float)this->depth/8.0); + depth = (int)ceil((float)this->stereo_depth/8.0); *left = new char[this->width*this->height*depth]; *right = new char[this->width*this->height*depth]; memcpy(*left,de_interleaved,this->width*this->height*depth); @@ -249,7 +261,7 @@ void CBumblebee::get_stereo_image(char **left,char **right) } else { - depth = (int)ceil((float)this->depth/8.0); + depth = (int)ceil((float)this->stereo_depth/8.0); *left = new char[this->width*this->height*depth]; *right = new char[this->width*this->height*depth]; memcpy(*left,de_interleaved,this->width*this->height*depth); @@ -260,6 +272,127 @@ void CBumblebee::get_stereo_image(char **left,char **right) } } +void Cbumblebee::get_stereo_image_shared(char *left,char *right) +{ + int depth; + dc1394error_t error; + dc1394video_frame_t *frame; + unsigned char *de_interleaved,*RGB_image; + + if ( *left != NULL || *right != NULL) + { + DEBUG_INFO("Invalid image buffer.\n"); + /* handle error */ + throw CFirewireCameraException(_HERE_,"Invalid image buffer. Please provide an unallocated memory buffer."); + } + DEBUG_INFO("Capturing a new image ... "); + if ( this->one_shot_mode == DC1394_ON ) + { + /* set the one shot mode */ + DEBUG_INFO("Setting the one shot mode ... "); + error = dc1394_video_set_one_shot(this->camera_handle,DC1394_ON); + if ( error != DC1394_SUCCESS ) + { + DEBUG_INFO("failed\n"); + /* handle the error */ + throw CFirewireInternalException(_HERE_,error); + } + DEBUG_INFO("ok\n"); + DEBUG_INFO("Dequeuing a DMA buffer ... "); + error = dc1394_capture_dequeue(this->camera_handle,DC1394_CAPTURE_POLICY_WAIT,&frame); + if ( error != DC1394_SUCCESS ) + { + DEBUG_INFO("failed\n"); + /* handle error */ + throw CFirewireInternalException(_HERE_,error); + } + depth = (int)ceil((float)this->depth/8.0); + de_interleaved=new unsigned char[this->width*this->height*depth]; + // de-interlace the 16 bit data into 2 bayer tile pattern images + dc1394_deinterlace_stereo( (unsigned char *)frame->image, + de_interleaved, + this->width, + 2*this->height); + + if(this->stereo_coding==RGB) + { + depth = (int)ceil((float)this->stereo_depth/8.0); + RGB_image=new unsigned char[this->width*2*this->height*depth]; + // extract color from the bayer tile image + // note: this will alias colors on the top and bottom rows + dc1394_bayer_decoding_8bit( de_interleaved, + RGB_image, + this->width, + 2*this->height, + this->bayer_pattern, + DC1394_BAYER_METHOD_NEAREST); + + memcpy(left,RGB_image,this->width*this->height*depth); + memcpy(right,RGB_image+this->height*this->width*depth,this->width*this->height*depth); + delete[] RGB_image; + } + else + { + depth = (int)ceil((float)this->stereo_depth/8.0); + memcpy(left,de_interleaved,this->width*this->height*depth); + memcpy(right,de_interleaved+this->height*this->width*depth,this->width*this->height*depth); + } + if(this->frame_buffer!=NULL) + delete[] this->frame_buffer; + depth = (int)ceil((float)this->depth/8.0); + this->frame_buffer = new char[this->width*this->height*depth]; + memcpy(this->frame_buffer,frame->image,this->width*this->height*this->depth/8.0); + DEBUG_INFO("ok\n"); + DEBUG_INFO("Freeing the DMA buffer ... "); + error = dc1394_capture_enqueue(this->camera_handle,frame); + if ( error != DC1394_SUCCESS ) + { + DEBUG_INFO("failed\n"); + /* handle error */ + throw CFirewireInternalException(_HERE_,error); + } + DEBUG_INFO("ok\n"); + delete[] de_interleaved; + } + else + { + this->image_access.enter(); + depth = (int)ceil((float)this->depth/8.0); + de_interleaved=new unsigned char[this->width*this->height*depth]; + // de-interlace the 16 bit data into 2 bayer tile pattern images + dc1394_deinterlace_stereo( (unsigned char *)this->frame_buffer, + de_interleaved, + this->width, + 2*this->height); + + if(this->stereo_coding==RGB) + { + depth = (int)ceil((float)this->stereo_depth/8.0); + RGB_image=new unsigned char[this->width*2*this->height*depth]; + // extract color from the bayer tile image + // note: this will alias colors on the top and bottom rows + dc1394_bayer_decoding_8bit( de_interleaved, + RGB_image, + this->width, + 2*this->height, + this->bayer_pattern, + DC1394_BAYER_METHOD_NEAREST); + + memcpy(left,RGB_image,this->width*this->height*depth); + memcpy(right,RGB_image+this->width*this->height*depth,this->width*this->height*depth); + delete[] RGB_image; + } + else + { + depth = (int)ceil((float)this->stereo_depth/8.0); + memcpy(left,de_interleaved,this->width*this->height*depth); + memcpy(right,de_interleaved+this->height*this->width*depth,this->width*this->height*depth); + } + this->image_access.exit(); + delete[] de_interleaved; + } +} + void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right) { std::string header,name; @@ -287,7 +420,7 @@ void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right header+=" "; header+=text.str(); header+='\n'; - if ( this->depth == DEPTH48 ) + if ( this->stereo_depth == DEPTH48 ) header+="65535\n"; else header+="255\n"; @@ -302,7 +435,7 @@ void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right header+=" "; header+=text.str(); header+='\n'; - if ( this->depth == DEPTH16 ) + if ( this->stereo_depth == DEPTH16 ) header+="65535\n"; else header+="255\n"; @@ -310,7 +443,7 @@ void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right depth = (int)ceil((float)this->stereo_depth/8.0); write(file_left,header.c_str(),header.size()); write(file_right,header.c_str(),header.size()); - for( i = 0 ; i < this->height ; i++ ) + for( i = 0 ; i < this->height ; i++ ) { write(file_left,&left[i*this->width*depth],this->width*depth); write(file_right,&right[i*this->width*depth],this->width*depth); diff --git a/src/bumblebee.h b/src/bumblebee.h index b7b9c598cabc424c9e52c75c82a227613a359dfd..71a99c63bca30ae61ab2f69afb8ad6065db6db5b 100755 --- a/src/bumblebee.h +++ b/src/bumblebee.h @@ -44,6 +44,11 @@ class CBumblebee : public CPTGCamera * */ void get_stereo_image(char **left,char **right); + /** + * \brief + * + */ + void get_stereo_image_shared(char *left,char *right); /** * \brief * diff --git a/src/examples/bumblebee.cpp b/src/examples/bumblebee.cpp index 98ebb2b194b5c84a8795041e6f7625af6f946d0f..d76dcbc255522b8de585f5db5d239dbb048f7ade 100755 --- a/src/examples/bumblebee.cpp +++ b/src/examples/bumblebee.cpp @@ -40,6 +40,8 @@ int main(int argc, char *argv[]) event_server=CEventServer::instance(); bumblebee->get_config(&left_off,&top_off,&width,&height,&framerate,&depth,&coding); framerate=20; + coding=MONO; + depth=DEPTH8; bumblebee->set_config(&left_off,&top_off,&width,&height,&framerate,depth,coding); bumblebee->get_stereo_config(&width,&height,&framerate,&depth,&coding); std::cout << "Image size: " << width << "x" << height << std::endl; @@ -52,7 +54,7 @@ int main(int argc, char *argv[]) { text.str(""); gettimeofday(&start_time,NULL); - event_server->wait_all(events,0); + event_server->wait_all(events,1000); bumblebee->get_stereo_image(&left,&right); filename="image_"; text << i;