Revision: 7092
http://playerstage.svn.sourceforge.net/playerstage/?rev=7092&view=rev
Author: veedee
Date: 2008-10-10 16:15:16 +0000 (Fri, 10 Oct 2008)
Log Message:
-----------
added driver for Videre Design STOC (Stereo on a Chip) cameras
Modified Paths:
--------------
code/player/trunk/server/drivers/CMakeLists.txt
Added Paths:
-----------
code/player/trunk/server/drivers/stereo/
code/player/trunk/server/drivers/stereo/CMakeLists.txt
code/player/trunk/server/drivers/stereo/stoc.cc
Modified: code/player/trunk/server/drivers/CMakeLists.txt
===================================================================
--- code/player/trunk/server/drivers/CMakeLists.txt 2008-10-10 12:33:26 UTC
(rev 7091)
+++ code/player/trunk/server/drivers/CMakeLists.txt 2008-10-10 16:15:16 UTC
(rev 7092)
@@ -29,6 +29,7 @@
ADD_SUBDIRECTORY (shell)
ADD_SUBDIRECTORY (sonar)
ADD_SUBDIRECTORY (speech)
+ADD_SUBDIRECTORY (stereo)
ADD_SUBDIRECTORY (vectormap)
# ADD_SUBDIRECTORY (waveform)
ADD_SUBDIRECTORY (wifi)
Added: code/player/trunk/server/drivers/stereo/CMakeLists.txt
===================================================================
--- code/player/trunk/server/drivers/stereo/CMakeLists.txt
(rev 0)
+++ code/player/trunk/server/drivers/stereo/CMakeLists.txt 2008-10-10
16:15:16 UTC (rev 7092)
@@ -0,0 +1,2 @@
+PLAYERDRIVER_OPTION (stoc build_stoc ON)
+PLAYERDRIVER_ADD_DRIVER (stoc build_stoc LINKFLAGS "-lsvscap -lsvs -lsvscalc
-lpthread -ldcap -lraw1394" SOURCES stoc.cc)
Added: code/player/trunk/server/drivers/stereo/stoc.cc
===================================================================
--- code/player/trunk/server/drivers/stereo/stoc.cc
(rev 0)
+++ code/player/trunk/server/drivers/stereo/stoc.cc 2008-10-10 16:15:16 UTC
(rev 7092)
@@ -0,0 +1,710 @@
+/*
+ * Player - One Hell of a Robot Server
+ * Copyright (C) 2006 Radu Bogdan Rusu ([EMAIL PROTECTED])
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/** @ingroup drivers */
+/** @{ */
+/** @defgroup driver_stoc stoc
+ * @brief STOC
+
+The stoc driver controls Videre Design's STOC (Stereo on a Chip) cameras
+through the SVS (Small Vision System) library. The driver provides a @ref
+interface_stereo interface.
+
[EMAIL PROTECTED] Compile-time dependencies
+
+- none
+
[EMAIL PROTECTED] Provides
+
+- @ref interface_stereo : left and right images, disparity image, and a 3d
+ point cloud generated from the disparity
+
[EMAIL PROTECTED] Requires
+
+- none
+
[EMAIL PROTECTED] Supported configuration requests
+
+ - none
+
[EMAIL PROTECTED] Properties provided
+
+ -none yet
+
[EMAIL PROTECTED] Configuration file options
+
+ - capture_type (integer)
+ - Default: SVS defaults
+ - CAP_DUAL or CAP_INTERLACE
+
+ - format (integer)
+ - Default: SVS defaults
+ - MONOCHROME, YUV, or RGB24
+
+ - channel (integer)
+ - Default: SVS defaults
+ - 0, 1, 2 etc, video channel on card
+
+ - swap (boolean)
+ - Default: SVS defaults
+ - Swapping left/right on or off
+
+ - color_mode (integer)
+ - Default: SVS defaults
+ - Color mode: 0 (both), 1 (left only), 2 (right only)
+
+ - color_alg (integer)
+ - Default: SVS defaults
+ - Color algorithm (see SVS manual)
+
+ - rectification (boolean)
+ - Default: SVS defaults
+ - Image rectification: enabled (1) / disabled (0)
+
+ - proc_mode (integer)
+ - Default: SVS defaults
+ - Processing mode for the STOC
+
+ - rate (integer)
+ - Default: SVS defaults
+ - Image rate
+
+ - frame_div (integer)
+ - Default: SVS defaults
+ - Image sampling
+
+ - image_size (integer typle)
+ - Default: 640 480
+ - Image width and height
+
+ - z_max (float)
+ - Default: 5 (meters)
+ - Cutoff distance on Z-axis
+
+ - ndisp (integer)
+ - Default: SVS defaults
+ - Set number of disparities, 8 to 128
+
+ - tex_thresh (integer)
+ - Default: SVS defaults
+ - Set texture filter threshold
+
+ - unique (integer)
+ - Default: SVS defaults
+ - Set uniqueness filter threshold
+
+ - corrsize (integer)
+ - Default: SVS defaults
+ - Set correlation window size, 7 to 21
+
+ - horopter (integer)
+ - Default: SVS defaults
+ - Set horopter (X offset)
+
+ - speckle_size (integer)
+ - Default: SVS defaults
+ - Set minimum disparity region size
+
+ - speckle_diff (integer)
+ - Default: SVS defaults
+ - Set disparity region neighbor difference
+
+ - cut_di (integer)
+ - Default: 0
+ - Number of lines to "cut" (disconsider) at the bottom of the disparity
image
+
+ - multiproc_en (boolean)
+ - Default: 0
+ - Use SVS multiprocessing capabilities (see SVS manual)
+
[EMAIL PROTECTED] Example
+
[EMAIL PROTECTED]
+driver
+(
+ name "stoc"
+ provides ["stereo:0"]
+
+ ## ---[ Misc camera parameters: all -1 values assume SVS defaults
+ # Color mode: 0 (both), 1 (left only), 2 (right only)
+ color_mode 0
+ # Color algorithm: COLOR_ALG_BEST (2), or COLOR_ALG_FAST (0) - check SVS
manual
+ color_alg 2
+
+ # Processing mode for STOC: PROC_MODE_OFF (0), PROC_MODE_NONE (1),
PROC_MODE_TEST (2),
+ # PROC_MODE_RECTIFIED (3), PROC_MODE_DISPARITY
(4), PROC_MODE_DISPARITY_RAW (5)
+ # Check your STOC camera manual for extra details.
+ proc_mode 5
+
+ # Image rate in fps
+ rate 15
+
+ # Image rectification: enabled (1) / disabled (0)
+ rectification 1
+
+ ## ---[ Stereo parameters: all -1 values assume SVS defaults
+ # Points to disconsider at the bottom of the disparity image (due to errors
in SVS?)
+ cut_di 32
+
+ # Number of disparities, 8 to 128
+ ndisp 64
+
+ # Texture filter threshold (confidence)
+ tex_thresh 4
+
+ # Uniqueness filter threshold
+ unique 3
+
+ # Correlation window size, 7 to 21
+ corrsize 15
+
+ # Minimum disparity region size
+ speckle_size 400
+)
[EMAIL PROTECTED]
+
[EMAIL PROTECTED] Radu Bogdan Rusu
+ */
+/** @} */
+
+#include <stdlib.h>
+#include <libplayercore/playercore.h>
+#include <SVS/svsclass.h>
+
+#define IMAGE_WIDTH 640
+#define IMAGE_HEIGHT 480
+
+#define CUTOFF_DIST 5
+
+class STOC:public Driver
+{
+ public:
+ // constructor
+ STOC (ConfigFile* cf, int section);
+ ~STOC ();
+
+ int Setup ();
+ int Shutdown ();
+
+ // MessageHandler
+ virtual int ProcessMessage (QueuePointer &resp_queue,
+ player_msghdr * hdr,
+ void * data);
+
+ private:
+
+ virtual void Main ();
+ void RefreshData ();
+
+ // device bookkeeping
+ player_devaddr_t stereo_addr;
+ player_stereo_data_t stereo_data;
+
+ int capture_type, format, channel;
+ bool swap_mode;
+ int color_mode, color_alg;
+ int proc_mode, rate, frame_div, size_w, size_h;
+ bool rectification, multiproc_en;
+ float z_max;
+
+ int ndisp, tex_thresh, unique, corrsize, horopter, speckle_size,
speckle_diff;
+ int cut_di;
+
+ const char *parameter_file; // user given parameter file for the camera
+ // SVS objects
+ svsVideoImages *video;
+ svsStereoProcess *process;
+ svsMultiProcess *multiproc;
+
+ protected:
+ // Properties
+ IntProperty exposure, balance, gamma, brightness, saturation;
+
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//Factory creation function. This functions is given as an argument when
+// the driver is added to the driver table
+Driver*
+ STOC_Init (ConfigFile* cf, int section)
+{
+ return ((Driver*)(new STOC (cf, section)));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//Registers the driver in the driver table. Called from the
+// player_driver_init function that the loader looks for
+void
+ stoc_Register (DriverTable* table)
+{
+ table->AddDriver ("stoc", STOC_Init);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Constructor. Retrieve options from the configuration file and do any
+// pre-Setup() setup.
+STOC::STOC (ConfigFile* cf, int section)
+ : Driver (cf, section),
+ exposure ("exposure", 0, 0),
+ balance ("balance", 0, 0),
+ gamma ("gamma", 0, 0),
+ brightness ("brightness", 0, 0),
+ saturation ("saturation", 0, 0)
+{
+ memset (&this->stereo_addr, 0, sizeof (player_devaddr_t));
+
+ this->RegisterProperty ("exposure", &this->exposure, cf, section);
+ this->RegisterProperty ("balance", &this->balance, cf, section);
+ this->RegisterProperty ("gamma", &this->gamma, cf, section);
+ this->RegisterProperty ("brightness", &this->brightness, cf, section);
+ this->RegisterProperty ("saturation", &this->saturation, cf, section);
+
+ // Check whether the user provided a parameter file for the STOC
+ parameter_file = cf->ReadString (section, "param_file", NULL);
+
+ // SVS camera parameters
+ capture_type = cf->ReadInt (section, "capture_type", -1); // CAP_DUAL or
CAP_INTERLACE
+ format = cf->ReadInt (section, "format", -1); // MONOCHROME,
YUV, or RGB24
+ channel = cf->ReadInt (section, "channel", -1); // 0, 1, 2 etc,
video channel on card
+ swap_mode = cf->ReadBool (section, "swap", false); // Swapping
left/right on or off
+ color_mode = cf->ReadInt (section, "color_mode", -1); // Color mode: 0
(both), 1 (left only), 2 (right only)
+ color_alg = cf->ReadInt (section, "color_alg", -1); // Color
algorithm (see SVS manual)
+
+ rectification = cf->ReadBool (section, "rectification", -1); // Image
rectification: enabled (1) / disabled (0)
+ proc_mode = cf->ReadInt (section, "proc_mode", -1); // Processing
mode for STOC
+ rate = cf->ReadInt (section, "rate", -1); // Image rate
+ frame_div = cf->ReadInt (section, "frame_div", -1); // Image
sampling
+ size_w = cf->ReadTupleInt (section, "image_size", 0, IMAGE_WIDTH);
// Image width
+ size_h = cf->ReadTupleInt (section, "image_size", 1, IMAGE_HEIGHT);
// Image height
+
+ // Stereo parameters
+ z_max = cf->ReadFloat (section, "z_max", CUTOFF_DIST); // Cutoff distance
on Z-axis
+
+ ndisp = cf->ReadInt (section, "ndisp", -1); // Set number of
disparities, 8 to 128
+ tex_thresh = cf->ReadInt (section, "tex_thresh", -1); // Set texture
filter threshold
+ unique = cf->ReadInt (section, "unique", -1); // Set
uniqueness filter threshold
+ corrsize = cf->ReadInt (section, "corrsize", -1); // Set
correlation window size, 7 to 21
+ horopter = cf->ReadInt (section, "horopter", -1); // Set horopter
(X offset)
+ speckle_size = cf->ReadInt (section, "speckle_size", -1); // Set minimum
disparity region size
+ speckle_diff = cf->ReadInt (section, "speckle_dif", -1); // Set disparity
region neighbor difference
+
+ cut_di = cf->ReadInt (section, "cut_di", 0); // Cut points at
the bottom of the disparity image
+
+ multiproc_en = cf->ReadBool (section, "multiproc", 0); // SVS multiproc
(check manual): enabled (1) / disabled (0)
+
+ if (cf->ReadDeviceAddr (&(this->stereo_addr), section, "provides",
PLAYER_STEREO_CODE, -1, NULL) == 0)
+ {
+ if (this->AddInterface (this->stereo_addr) != 0)
+ {
+ this->SetError (-1);
+ return;
+ }
+ }
+
+ process = new svsStereoProcess (); // Compute the disparity image, and 3D
points
+ multiproc = new svsMultiProcess (); // Multiscale processing
+ video = getVideoObject (); // Get access to the video stream
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Destructor.
+STOC::~STOC ()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Set up the device. Return 0 if things go well, and -1 otherwise.
+int
+ STOC::Setup ()
+{
+ int res;
+
+ int nr_cam = video->Enumerate (); // Get the number of cameras available
+
+ // We only support one camera for now
+ if (nr_cam == 0)
+ {
+ PLAYER_ERROR ("No camera found!");
+ return (-1);
+ }
+
+ for (int i = 0; i < nr_cam; i++)
+ PLAYER_MSG2 (0, "> Found camera %d: %s", i, video->DeviceIDs ()[i]);
+
+ res = video->Open (nr_cam - 1); // Open camera
+
+ if (!res)
+ {
+ PLAYER_ERROR ("Could not connect to camera!");
+ return (-1);
+ }
+
+ /// ---[ Set camera options
+ if (parameter_file != NULL)
+ {
+ video->ReadParams ((char*)parameter_file);
+ PLAYER_MSG1 (1, ">> Using camera parameters from %s", parameter_file);
+ }
+ else
+ {
+ if (capture_type != -1)
+ {
+ if (video->SetCapture (capture_type))
+ PLAYER_MSG1 (2, ">> Set capture type to %d", capture_type);
+ else
+ PLAYER_ERROR1 (">> Error while setting capture type to %d!",
capture_type);
+ }
+
+ if (format != -1)
+ {
+ if (video->SetFormat (format))
+ PLAYER_MSG1 (2, ">> Set format type to %d", format);
+ else
+ PLAYER_ERROR1 (">> Error setting format type to %d!", format);
+ }
+
+ if (channel != -1)
+ {
+ if (video->SetChannel (channel))
+ PLAYER_MSG1 (2, ">> Set channel type to %d", channel);
+ else
+ PLAYER_ERROR1 (">> Error setting channel type to %d!", channel);
+ }
+
+ if (swap_mode)
+ {
+ if (video->SetSwap (swap_mode))
+ PLAYER_MSG0 (2, ">> Swap mode enabled");
+ else
+ PLAYER_ERROR (">> Error enabling swap mode!");
+ }
+
+ if (color_mode != -1)
+ {
+ bool r;
+ if (color_mode == 0) r = video->SetColor (true, true);
+ if (color_mode == 1) r = video->SetColor (true, false);
+ if (color_mode == 2) r = video->SetColor (false, true);
+ if (r)
+ PLAYER_MSG1 (2, ">> Color mode set to %d", color_mode);
+ else
+ PLAYER_ERROR (">> Error setting color mode to %d!");
+ }
+
+ if (color_alg != -1)
+ {
+ if (video->SetColorAlg (color_alg))
+ PLAYER_MSG1 (2, ">> Color algorithm set to %d", color_alg);
+ else
+ PLAYER_ERROR1 (">> Error setting color algorithm to %d!", color_alg);
+ }
+
+ if (video->SetSize (size_w, size_h))
+ PLAYER_MSG2 (2, ">> Image size set to %dx%d", size_w, size_h);
+ else
+ PLAYER_ERROR2 (">> Error setting image size to %dx%d!", size_w, size_h);
+
+ if (frame_div != -1)
+ {
+ if (video->SetFrameDiv (frame_div))
+ PLAYER_MSG1 (2, ">> Image sampling set to %d", frame_div);
+ else
+ PLAYER_ERROR1 (">> Error setting image sampling to %d!", frame_div);
+ }
+
+ if (rate != -1)
+ {
+ if (video->SetRate (rate))
+ PLAYER_MSG1 (2, ">> Image rate set to %d", rate);
+ else
+ PLAYER_ERROR1 (">> Error setting image rate to %d!", rate);
+ }
+
+ if (proc_mode != -1)
+ {
+ if (video->SetProcMode (proc_mode_type(proc_mode)))
+ PLAYER_MSG1 (2, ">> STOC processing mode set to %d", proc_mode);
+ else
+ PLAYER_ERROR1 (">> Error setting STOC processing mode to %d!",
proc_mode);
+ }
+
+ if (rectification != -1)
+ {
+ if (video->SetRect (rectification))
+ PLAYER_MSG1 (2, ">> Image rectification set to %d", rectification);
+ else
+ PLAYER_ERROR1 (">> Error setting image rectification to %d!",
rectification);
+ }
+ }
+ video->binning = 1;
+
+ /// ---[ Stereo options
+ if (cut_di != 0)
+ PLAYER_MSG1 (2, ">> [stereo] Disconsidering the last %d lines from the
bottom of the disparity image...", cut_di);
+ if (ndisp != -1)
+ {
+ video->SetNDisp (ndisp);
+ PLAYER_MSG1 (2, ">> [stereo] Number of disparities set to %d", ndisp);
+ }
+ if (tex_thresh != -1)
+ {
+ video->SetThresh (tex_thresh);
+ PLAYER_MSG1 (2, ">> [stereo] Texture filter threshold set to %d",
tex_thresh);
+ }
+ if (unique != -1)
+ {
+ video->SetUnique (unique);
+ PLAYER_MSG1 (2, ">> [stereo] Uniqueness filter threshold set to %d",
unique);
+ }
+ if (corrsize != -1)
+ {
+ video->SetCorrsize (corrsize);
+ PLAYER_MSG1 (2, ">> [stereo] Correlation window size set to %d", corrsize);
+ }
+ if (horopter != -1)
+ {
+ video->SetHoropter (horopter);
+ PLAYER_MSG1 (2, ">> [stereo] Horopter (X-Offset) value set to %d",
horopter);
+ }
+ if (speckle_size != -1)
+ {
+ video->SetSpeckleSize (speckle_size);
+ PLAYER_MSG1 (2, ">> [stereo] Minimum disparity region size set to %d",
speckle_size);
+ }
+ if (speckle_diff != -1)
+ {
+ video->SetSpeckleDiff (speckle_diff);
+ PLAYER_MSG1 (2, ">> [stereo] Disparity region neighbor diff to %d",
speckle_diff);
+ }
+
+ PLAYER_MSG0 (0, "> Connected to camera");
+
+ // Start video streaming
+ res = video->Start ();
+
+ StartThread ();
+ return (0);
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+// Shutdown the device
+int
+ STOC::Shutdown ()
+{
+ StopThread ();
+
+ int res = video->Stop (); // Stop video streaming
+ res = video->Close (); // Close camera
+ PLAYER_MSG0 (1, "> Closed camera connection.");
+ return (0);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// ProcessMessage
+int
+ STOC::ProcessMessage (QueuePointer &resp_queue,
+ player_msghdr * hdr,
+ void * data)
+{
+ assert (hdr);
+ assert (data);
+
+ // To do: offset, exposure, autoexposure parameters, balance, gamma,
brightness, saturation
+ // level and horopter
+
+ return (0);
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+void
+ STOC::Main ()
+{
+ for (;;)
+ {
+ // handle commands and requests/replies --------------------------------
+ pthread_testcancel ();
+ ProcessMessages ();
+ RefreshData ();
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// RefreshData function
+void
+ STOC::RefreshData ()
+{
+ int res;
+
+ svsStereoImage *si = video->GetImage (10); // 10 ms timeout
+ if (si == NULL)
+ PLAYER_WARN ("No image, timed out...");
+
+ // Compute the disparity image
+ if (multiproc_en)
+ multiproc->CalcStereo (si);
+ else
+ process->CalcStereo (si);
+
+ // Trim down those nasty points at the bottom of the disparity image
(errors?)
+ for (int i = si->ip.height - cut_di; i < si->ip.height; i++)
+ for (int j = 0; j < si->ip.width; j++)
+ si->disparity[i * si->ip.width + j] = -2;
+
+ // Compute the 3D point cloud information
+ if (multiproc_en)
+ multiproc->Calc3D (si, 0, 0, 0, 0, NULL, NULL, z_max);
+ else
+ process->Calc3D (si, 0, 0, 0, 0, NULL, NULL, z_max);
+
+ // Save the 3D point cloud data in the structure, if present
+ int nr_points = 0;
+ stereo_data.points = NULL;
+ if (si->have3D)
+ {
+ stereo_data.points = new
player_pointcloud3d_stereo_element_t[si->ip.height * si->ip.width];
+
+ svs3Dpoint *pts = si->pts3D;
+ for (int i = 0; i < si->ip.height; i++)
+ {
+ for (int j = 0; j < si->ip.width; j++, pts++)
+ {
+ // Check if the point is valid
+ if (pts->A <= 0)
+ continue;
+
+ player_pointcloud3d_stereo_element_t point;
+ point.px = pts->X;
+ point.py = pts->Y;
+ point.pz = pts->Z;
+
+ if (si->haveColor)
+ {
+ svsColorPixel *mpc = (svsColorPixel*)(si->color + (i*si->ip.width +
j) * 4);
+ point.red = mpc->r; // red
+ point.green = mpc->g; // green
+ point.blue = mpc->b; // blue
+ }
+ else
+ {
+ point.red = point.green = point.blue = (unsigned char)si->Left
()[i*si->ip.width + j];
+ }
+ stereo_data.points[nr_points] = point;
+ nr_points++;
+ } // width
+ } // height
+
+ } // have3D
+ stereo_data.points_count = nr_points;
+
+ // Save the stereo left/right image
+ stereo_data.left_channel.height = stereo_data.right_channel.height =
si->ip.height;
+ stereo_data.left_channel.width = stereo_data.right_channel.width =
si->ip.width;
+ stereo_data.left_channel.fdiv = stereo_data.right_channel.fdiv =
frame_div;
+ stereo_data.left_channel.compression = stereo_data.right_channel.compression
= PLAYER_CAMERA_COMPRESS_RAW;
+ stereo_data.left_channel.image_count = stereo_data.left_channel.width *
stereo_data.left_channel.height;
+ stereo_data.right_channel.image_count = stereo_data.left_channel.width *
stereo_data.left_channel.height;
+
+ // Set MONO by default on both left and right
+ stereo_data.left_channel.format = PLAYER_CAMERA_FORMAT_MONO8;
+ stereo_data.left_channel.bpp = 8;
+ stereo_data.left_channel.image = si->Left ();
+ stereo_data.right_channel.format = PLAYER_CAMERA_FORMAT_MONO8;
+ stereo_data.right_channel.bpp = 8;
+ stereo_data.right_channel.image = si->Right ();
+
+ uint8_t *in_left, *in_right, *out_left, *out_right;
+ // Check if <left> has color or monochrome
+ if (si->haveColor)
+ {
+ stereo_data.left_channel.format = PLAYER_CAMERA_FORMAT_RGB888;
+ stereo_data.left_channel.bpp = 24;
+ stereo_data.left_channel.image_count *= 3;
+ in_left = (uint8_t*)si->Color ();
+ stereo_data.left_channel.image = new unsigned char
[stereo_data.left_channel.image_count];
+ out_left = (uint8_t*)stereo_data.left_channel.image;
+ }
+
+ // Check if <right> has color or monochrome
+ if (si->haveColorRight)
+ {
+ stereo_data.right_channel.format = PLAYER_CAMERA_FORMAT_RGB888;
+ stereo_data.right_channel.bpp = 24;
+ stereo_data.right_channel.image_count *= 3;
+ in_right = (uint8_t*)si->ColorRight ();
+ stereo_data.right_channel.image = new unsigned char
[stereo_data.right_channel.image_count];
+ out_right = (uint8_t*)stereo_data.right_channel.image;
+ }
+
+ for (int i = 0; i < (si->ip.height * si->ip.width); i++)
+ {
+ if (si->haveColor)
+ {
+ // Left
+ out_left[0] = in_left[0];
+ out_left[1] = in_left[1];
+ out_left[2] = in_left[2];
+ out_left += 3;
+ in_left += 4;
+ }
+ if (si->haveColorRight)
+ {
+ // Right
+ out_right[0] = in_right[0];
+ out_right[1] = in_right[1];
+ out_right[2] = in_right[2];
+ out_right += 3;
+ in_right += 4;
+ }
+ }
+
+ // Save the disparity image
+ stereo_data.disparity.width = stereo_data.disparity.height = 0;
+ stereo_data.disparity.bpp = 16;
+ stereo_data.disparity.fdiv = 1;
+ stereo_data.disparity.compression = PLAYER_CAMERA_COMPRESS_RAW;
+ stereo_data.disparity.format = PLAYER_CAMERA_FORMAT_MONO16;
+
+ if (si->haveDisparity)
+ {
+ stereo_data.disparity.width = si->dp.dwidth;
+ stereo_data.disparity.height = si->dp.dheight;
+ stereo_data.disparity.image = (uint8_t*)si->disparity;
+ }
+ stereo_data.disparity.image_count = stereo_data.disparity.width *
stereo_data.disparity.height * 2;
+
+ // Stereo data mode
+ stereo_data.mode = 1 + 2 + 4; // left + right + disparity
+
+ // Publish the stereo data
+ Publish (stereo_addr, PLAYER_MSGTYPE_DATA, PLAYER_STEREO_DATA_STATE,
(void*)&stereo_data);
+
+ // Cleanup
+ if (stereo_data.points != NULL)
+ delete [] stereo_data.points;
+ if (si->haveColor)
+ delete [] stereo_data.left_channel.image;
+ if (si->haveColorRight)
+ delete [] stereo_data.right_channel.image;
+
+ return;
+}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit