Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <pcl/pcl_config.h>
00038 #ifdef HAVE_OPENNI
00039
00040 #include <pcl/io/openni_camera/openni_device_primesense.h>
00041 #include <pcl/io/openni_camera/openni_image_yuv_422.h>
00042 #include <iostream>
00043 #include <sstream>
00044 #include <boost/thread/mutex.hpp>
00045
00046 using namespace std;
00047 using namespace boost;
00048
00049 namespace openni_wrapper
00050 {
00051
00052 DevicePrimesense::DevicePrimesense (xn::Context& context, const xn::NodeInfo& device_node, const xn::NodeInfo& image_node, const xn::NodeInfo& depth_node, const xn::NodeInfo& ir_node)
00053 : OpenNIDevice (context, device_node, image_node, depth_node, ir_node)
00054 {
00055
00056 enumAvailableModes ();
00057 setDepthOutputMode (getDefaultDepthMode ());
00058 setImageOutputMode (getDefaultImageMode ());
00059 setIROutputMode (getDefaultIRMode ());
00060
00061 unique_lock<mutex> image_lock(image_mutex_);
00062 XnStatus status = image_generator_.SetIntProperty ("InputFormat", 5);
00063 if (status != XN_STATUS_OK)
00064 THROW_OPENNI_EXCEPTION ("Error setting the image input format to Uncompressed YUV422. Reason: %s", xnGetStatusString (status));
00065
00066 status = image_generator_.SetPixelFormat (XN_PIXEL_FORMAT_YUV422);
00067 if (status != XN_STATUS_OK)
00068 THROW_OPENNI_EXCEPTION ("Failed to set image pixel format to YUV422. Reason: %s", xnGetStatusString (status));
00069
00070 image_lock.unlock ();
00071
00072 lock_guard<mutex> depth_lock(depth_mutex_);
00073 status = depth_generator_.SetIntProperty ("RegistrationType", 1);
00074 if (status != XN_STATUS_OK)
00075 THROW_OPENNI_EXCEPTION ("Error setting the registration type. Reason: %s", xnGetStatusString (status));
00076 }
00077
00078 DevicePrimesense::~DevicePrimesense () throw ()
00079 {
00080 setDepthRegistration ( false );
00081 setSynchronization ( false );
00082
00083 depth_mutex_.lock ();
00084 depth_generator_.UnregisterFromNewDataAvailable (depth_callback_handle_);
00085 depth_mutex_.unlock ();
00086
00087 image_mutex_.lock ();
00088 image_generator_.UnregisterFromNewDataAvailable (image_callback_handle_);
00089 image_mutex_.unlock ();
00090 }
00091
00092 bool DevicePrimesense::isImageResizeSupported (unsigned input_width, unsigned input_height, unsigned output_width, unsigned output_height) const throw ()
00093 {
00094 return ImageYUV422::resizingSupported (input_width, input_height, output_width, output_height);
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 void DevicePrimesense::enumAvailableModes () throw ()
00139 {
00140 XnMapOutputMode output_mode;
00141 available_image_modes_.clear();
00142 available_depth_modes_.clear();
00143
00144
00145 output_mode.nFPS = 30;
00146 output_mode.nXRes = XN_VGA_X_RES;
00147 output_mode.nYRes = XN_VGA_Y_RES;
00148 available_depth_modes_.push_back (output_mode);
00149
00150 output_mode.nFPS = 25;
00151 output_mode.nXRes = XN_VGA_X_RES;
00152 output_mode.nYRes = XN_VGA_Y_RES;
00153 available_depth_modes_.push_back (output_mode);
00154
00155 output_mode.nFPS = 25;
00156 output_mode.nXRes = XN_QVGA_X_RES;
00157 output_mode.nYRes = XN_QVGA_Y_RES;
00158 available_depth_modes_.push_back (output_mode);
00159
00160 output_mode.nFPS = 30;
00161 output_mode.nXRes = XN_QVGA_X_RES;
00162 output_mode.nYRes = XN_QVGA_Y_RES;
00163 available_depth_modes_.push_back (output_mode);
00164
00165 output_mode.nFPS = 60;
00166 output_mode.nXRes = XN_QVGA_X_RES;
00167 output_mode.nYRes = XN_QVGA_Y_RES;
00168 available_depth_modes_.push_back (output_mode);
00169
00170
00171 output_mode.nFPS = 30;
00172 output_mode.nXRes = XN_VGA_X_RES;
00173 output_mode.nYRes = XN_VGA_Y_RES;
00174 available_image_modes_.push_back (output_mode);
00175
00176 output_mode.nFPS = 25;
00177 output_mode.nXRes = XN_VGA_X_RES;
00178 output_mode.nYRes = XN_VGA_Y_RES;
00179 available_image_modes_.push_back (output_mode);
00180
00181
00182
00183
00184
00185
00186 output_mode.nFPS = 25;
00187 output_mode.nXRes = XN_QVGA_X_RES;
00188 output_mode.nYRes = XN_QVGA_Y_RES;
00189 available_image_modes_.push_back (output_mode);
00190
00191 output_mode.nFPS = 30;
00192 output_mode.nXRes = XN_QVGA_X_RES;
00193 output_mode.nYRes = XN_QVGA_Y_RES;
00194 available_image_modes_.push_back (output_mode);
00195
00196 output_mode.nFPS = 60;
00197 output_mode.nXRes = XN_QVGA_X_RES;
00198 output_mode.nYRes = XN_QVGA_Y_RES;
00199 available_image_modes_.push_back (output_mode);
00200 }
00201
00202 boost::shared_ptr<Image> DevicePrimesense::getCurrentImage (boost::shared_ptr<xn::ImageMetaData> image_data) const throw ()
00203 {
00204 return boost::shared_ptr<Image> ( new ImageYUV422 (image_data) );
00205 }
00206
00207 void DevicePrimesense::startImageStream ()
00208 {
00209
00210
00211
00212 if (isDepthStreamRunning ())
00213 {
00214 if (isDepthRegistered ())
00215 {
00216
00217 setDepthRegistration (false);
00218
00219
00220 setDepthRegistration (true);
00221
00222
00223 setDepthRegistration (false);
00224
00225
00226 OpenNIDevice::startImageStream ();
00227
00228
00229 setDepthRegistration (true);
00230 }
00231 else
00232 {
00233
00234 setDepthRegistration (true);
00235
00236 setDepthRegistration (false);
00237
00238
00239 OpenNIDevice::startImageStream ();
00240 }
00241 }
00242 else
00243
00244 OpenNIDevice::startImageStream ();
00245 }
00246
00247 void DevicePrimesense::startDepthStream ()
00248 {
00249 if (isDepthRegistered ())
00250 {
00251
00252 setDepthRegistration (false);
00253
00254
00255 OpenNIDevice::startDepthStream ();
00256
00257
00258 setDepthRegistration (true);
00259 }
00260 else
00261
00262 OpenNIDevice::startDepthStream ();
00263 }
00264
00265 }
00266 #endif