Skip to content
Snippets Groups Projects
Commit bb6b8ef7 authored by Sergi Hernandez's avatar Sergi Hernandez
Browse files

Added a new configuration to publish RAW images (bayern)

parent 4cce3806
No related branches found
No related tags found
No related merge requests found
...@@ -58,13 +58,25 @@ void CBumblebee::set_config(unsigned int *left_off,unsigned int *top_off,unsigne ...@@ -58,13 +58,25 @@ void CBumblebee::set_config(unsigned int *left_off,unsigned int *top_off,unsigne
} }
this->mode=DC1394_VIDEO_MODE_FORMAT7_3; this->mode=DC1394_VIDEO_MODE_FORMAT7_3;
// configure the camera // configure the camera
if(this->stereo_coding==MONO) if(this->stereo_coding==MONO)// the image sensor is mono
{ {
this->coding=MONO; this->coding=MONO;
dc1394_coding=DC1394_COLOR_CODING_MONO16; 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; this->coding=RAW;
dc1394_coding=DC1394_COLOR_CODING_RAW16; dc1394_coding=DC1394_COLOR_CODING_RAW16;
} }
...@@ -194,7 +206,7 @@ void CBumblebee::get_stereo_image(char **left,char **right) ...@@ -194,7 +206,7 @@ void CBumblebee::get_stereo_image(char **left,char **right)
} }
else 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]; *left = new char[this->width*this->height*depth];
*right = new char[this->width*this->height*depth]; *right = new char[this->width*this->height*depth];
memcpy(*left,de_interleaved,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) ...@@ -249,7 +261,7 @@ void CBumblebee::get_stereo_image(char **left,char **right)
} }
else 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]; *left = new char[this->width*this->height*depth];
*right = new char[this->width*this->height*depth]; *right = new char[this->width*this->height*depth];
memcpy(*left,de_interleaved,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) ...@@ -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) void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right)
{ {
std::string header,name; std::string header,name;
...@@ -287,7 +420,7 @@ void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right ...@@ -287,7 +420,7 @@ void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right
header+=" "; header+=" ";
header+=text.str(); header+=text.str();
header+='\n'; header+='\n';
if ( this->depth == DEPTH48 ) if ( this->stereo_depth == DEPTH48 )
header+="65535\n"; header+="65535\n";
else else
header+="255\n"; header+="255\n";
...@@ -302,7 +435,7 @@ void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right ...@@ -302,7 +435,7 @@ void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right
header+=" "; header+=" ";
header+=text.str(); header+=text.str();
header+='\n'; header+='\n';
if ( this->depth == DEPTH16 ) if ( this->stereo_depth == DEPTH16 )
header+="65535\n"; header+="65535\n";
else else
header+="255\n"; header+="255\n";
...@@ -310,7 +443,7 @@ void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right ...@@ -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); depth = (int)ceil((float)this->stereo_depth/8.0);
write(file_left,header.c_str(),header.size()); write(file_left,header.c_str(),header.size());
write(file_right,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_left,&left[i*this->width*depth],this->width*depth);
write(file_right,&right[i*this->width*depth],this->width*depth); write(file_right,&right[i*this->width*depth],this->width*depth);
......
...@@ -44,6 +44,11 @@ class CBumblebee : public CPTGCamera ...@@ -44,6 +44,11 @@ class CBumblebee : public CPTGCamera
* *
*/ */
void get_stereo_image(char **left,char **right); void get_stereo_image(char **left,char **right);
/**
* \brief
*
*/
void get_stereo_image_shared(char *left,char *right);
/** /**
* \brief * \brief
* *
......
...@@ -40,6 +40,8 @@ int main(int argc, char *argv[]) ...@@ -40,6 +40,8 @@ int main(int argc, char *argv[])
event_server=CEventServer::instance(); event_server=CEventServer::instance();
bumblebee->get_config(&left_off,&top_off,&width,&height,&framerate,&depth,&coding); bumblebee->get_config(&left_off,&top_off,&width,&height,&framerate,&depth,&coding);
framerate=20; framerate=20;
coding=MONO;
depth=DEPTH8;
bumblebee->set_config(&left_off,&top_off,&width,&height,&framerate,depth,coding); bumblebee->set_config(&left_off,&top_off,&width,&height,&framerate,depth,coding);
bumblebee->get_stereo_config(&width,&height,&framerate,&depth,&coding); bumblebee->get_stereo_config(&width,&height,&framerate,&depth,&coding);
std::cout << "Image size: " << width << "x" << height << std::endl; std::cout << "Image size: " << width << "x" << height << std::endl;
...@@ -52,7 +54,7 @@ int main(int argc, char *argv[]) ...@@ -52,7 +54,7 @@ int main(int argc, char *argv[])
{ {
text.str(""); text.str("");
gettimeofday(&start_time,NULL); gettimeofday(&start_time,NULL);
event_server->wait_all(events,0); event_server->wait_all(events,1000);
bumblebee->get_stereo_image(&left,&right); bumblebee->get_stereo_image(&left,&right);
filename="image_"; filename="image_";
text << i; text << i;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment