Commit c1a6cb62 authored by Maria Dimashova's avatar Maria Dimashova

added oni-files reading

parent 82a2a50f
...@@ -124,6 +124,8 @@ protected: ...@@ -124,6 +124,8 @@ protected:
xn::Context context; xn::Context context;
bool isContextOpened; bool isContextOpened;
xn::ProductionNode productionNode;
// Data generators with its metadata // Data generators with its metadata
xn::DepthGenerator depthGenerator; xn::DepthGenerator depthGenerator;
xn::DepthMetaData depthMetaData; xn::DepthMetaData depthMetaData;
...@@ -171,14 +173,22 @@ XnMapOutputMode defaultMapOutputMode() ...@@ -171,14 +173,22 @@ XnMapOutputMode defaultMapOutputMode()
CvCapture_OpenNI::CvCapture_OpenNI( int index ) CvCapture_OpenNI::CvCapture_OpenNI( int index )
{ {
XnStatus status;
isContextOpened = false; isContextOpened = false;
// Initialize and configure the context. // Initialize and configure the context.
if( context.Init() == XN_STATUS_OK ) status = context.Init();
if( status != XN_STATUS_OK )
{ {
std::cerr << "CvCapture_OpenNI::CvCapture_OpenNI : Failed to initialize the context: "
<< std::string(xnGetStatusString(status)) << std::endl;
return;
}
// Find devices // Find devices
xn::NodeInfoList devicesList; xn::NodeInfoList devicesList;
XnStatus status = context.EnumerateProductionTrees( XN_NODE_TYPE_DEVICE, NULL, devicesList, 0 ); status = context.EnumerateProductionTrees( XN_NODE_TYPE_DEVICE, NULL, devicesList, 0 );
if( status != XN_STATUS_OK ) if( status != XN_STATUS_OK )
{ {
std::cerr << "CvCapture_OpenNI::CvCapture_OpenNI : Failed to enumerate production trees: " std::cerr << "CvCapture_OpenNI::CvCapture_OpenNI : Failed to enumerate production trees: "
...@@ -191,7 +201,7 @@ CvCapture_OpenNI::CvCapture_OpenNI( int index ) ...@@ -191,7 +201,7 @@ CvCapture_OpenNI::CvCapture_OpenNI( int index )
for( int i = 0; i < index; ++i ) it++; for( int i = 0; i < index; ++i ) it++;
xn::NodeInfo deviceNode = *it; xn::NodeInfo deviceNode = *it;
status = context.CreateProductionTree( deviceNode ); status = context.CreateProductionTree( deviceNode, productionNode );
if( status != XN_STATUS_OK ) if( status != XN_STATUS_OK )
{ {
std::cerr << "CvCapture_OpenNI::CvCapture_OpenNI : Failed to create production tree: " std::cerr << "CvCapture_OpenNI::CvCapture_OpenNI : Failed to create production tree: "
...@@ -275,14 +285,46 @@ CvCapture_OpenNI::CvCapture_OpenNI( int index ) ...@@ -275,14 +285,46 @@ CvCapture_OpenNI::CvCapture_OpenNI( int index )
outputMaps.resize( outputMapsTypesCount ); outputMaps.resize( outputMapsTypesCount );
isContextOpened = true; isContextOpened = true;
}
setProperty(CV_CAP_PROP_OPENNI_REGISTRATION, 1.0); setProperty(CV_CAP_PROP_OPENNI_REGISTRATION, 1.0);
} }
CvCapture_OpenNI::CvCapture_OpenNI(const char * filename) CvCapture_OpenNI::CvCapture_OpenNI(const char * filename)
{ {
CV_Assert(0); XnStatus status;
isContextOpened = false;
// Initialize and configure the context.
status = context.Init();
if( status != XN_STATUS_OK )
{
std::cerr << "CvCapture_OpenNI::CvCapture_OpenNI : Failed to initialize the context: "
<< std::string(xnGetStatusString(status)) << std::endl;
return;
}
// Open file
status = context.OpenFileRecording( filename, productionNode );
if( status != XN_STATUS_OK )
{
std::cerr << "CvCapture_OpenNI::CvCapture_OpenNI : Failed to open input file (" << filename << "): "
<< std::string(xnGetStatusString(status)) << std::endl;
return;
}
std::cout << context.FindExistingNode( XN_NODE_TYPE_DEPTH, depthGenerator ) << std::endl;
std::cout << context.FindExistingNode( XN_NODE_TYPE_IMAGE, imageGenerator ) << std::endl;
if( !readCamerasParams() )
{
std::cerr << "CvCapture_OpenNI::CvCapture_OpenNI : Could not read cameras parameters" << std::endl;
return;
}
outputMaps.resize( outputMapsTypesCount );
isContextOpened = true;
} }
CvCapture_OpenNI::~CvCapture_OpenNI() CvCapture_OpenNI::~CvCapture_OpenNI()
...@@ -424,6 +466,7 @@ double CvCapture_OpenNI::getDepthGeneratorProperty( int propIdx ) ...@@ -424,6 +466,7 @@ double CvCapture_OpenNI::getDepthGeneratorProperty( int propIdx )
break; break;
case CV_CAP_PROP_OPENNI_REGISTRATION : case CV_CAP_PROP_OPENNI_REGISTRATION :
propValue = depthGenerator.GetAlternativeViewPointCap().IsViewPointAs(imageGenerator) ? 1.0 : 0.0; propValue = depthGenerator.GetAlternativeViewPointCap().IsViewPointAs(imageGenerator) ? 1.0 : 0.0;
break;
default : default :
{ {
std::stringstream ss; std::stringstream ss;
...@@ -731,15 +774,14 @@ IplImage* CvCapture_OpenNI::retrieveValidDepthMask() ...@@ -731,15 +774,14 @@ IplImage* CvCapture_OpenNI::retrieveValidDepthMask()
inline void getBGRImageFromMetaData( const xn::ImageMetaData& imageMetaData, cv::Mat& bgrImage ) inline void getBGRImageFromMetaData( const xn::ImageMetaData& imageMetaData, cv::Mat& bgrImage )
{ {
int cols = imageMetaData.XRes(); if( imageMetaData.PixelFormat() != XN_PIXEL_FORMAT_RGB24 )
int rows = imageMetaData.YRes(); CV_Error( CV_StsUnsupportedFormat, "Unsupported format of grabbed image\n" );
cv::Mat rgbImage( rows, cols, CV_8UC3 );
cv::Mat rgbImage( imageMetaData.YRes(), imageMetaData.XRes(), CV_8UC3 );
const XnRGB24Pixel* pRgbImage = imageMetaData.RGB24Data(); const XnRGB24Pixel* pRgbImage = imageMetaData.RGB24Data();
// CV_Assert( 3*sizeof(uchar) == sizeof(XnRGB24Pixel) ); // CV_Assert( 3*sizeof(uchar) == sizeof(XnRGB24Pixel) );
memcpy( rgbImage.data, pRgbImage, cols*rows*sizeof(XnRGB24Pixel) ); memcpy( rgbImage.data, pRgbImage, rgbImage.total()*sizeof(XnRGB24Pixel) );
cv::cvtColor( rgbImage, bgrImage, CV_RGB2BGR ); cv::cvtColor( rgbImage, bgrImage, CV_RGB2BGR );
} }
......
...@@ -93,9 +93,11 @@ void printCommandLineParams() ...@@ -93,9 +93,11 @@ void printCommandLineParams()
cout << "-m Mask to set which output images are need. It is a string of size 5. Each element of this is '0' or '1' and" << endl; cout << "-m Mask to set which output images are need. It is a string of size 5. Each element of this is '0' or '1' and" << endl;
cout << " determine: is depth map, disparity map, valid pixels mask, rgb image, gray image need or not (correspondently)?" << endl ; cout << " determine: is depth map, disparity map, valid pixels mask, rgb image, gray image need or not (correspondently)?" << endl ;
cout << " By default -m 01010 i.e. disparity map and rgb image will be shown." << endl ; cout << " By default -m 01010 i.e. disparity map and rgb image will be shown." << endl ;
cout << "-r Filename of .oni video file. The data will grabbed from it." << endl ;
} }
void parseCommandLine( int argc, char* argv[], bool& isColorizeDisp, bool& isFixedMaxDisp, int& imageMode, bool retrievedImageFlags[] ) void parseCommandLine( int argc, char* argv[], bool& isColorizeDisp, bool& isFixedMaxDisp, int& imageMode, bool retrievedImageFlags[],
string& filename, bool& isFileReading )
{ {
// set defaut values // set defaut values
isColorizeDisp = true; isColorizeDisp = true;
...@@ -108,6 +110,9 @@ void parseCommandLine( int argc, char* argv[], bool& isColorizeDisp, bool& isFix ...@@ -108,6 +110,9 @@ void parseCommandLine( int argc, char* argv[], bool& isColorizeDisp, bool& isFix
retrievedImageFlags[3] = true; retrievedImageFlags[3] = true;
retrievedImageFlags[4] = false; retrievedImageFlags[4] = false;
filename.clear();
isFileReading = false;
if( argc == 1 ) if( argc == 1 )
{ {
help(); help();
...@@ -154,6 +159,11 @@ void parseCommandLine( int argc, char* argv[], bool& isColorizeDisp, bool& isFix ...@@ -154,6 +159,11 @@ void parseCommandLine( int argc, char* argv[], bool& isColorizeDisp, bool& isFix
exit(0); exit(0);
} }
} }
else if( !strcmp( argv[i], "-r" ) )
{
filename = argv[++i];
isFileReading = true;
}
else else
{ {
cout << "Unsupported command line argument: " << argv[i] << "." << endl; cout << "Unsupported command line argument: " << argv[i] << "." << endl;
...@@ -172,10 +182,17 @@ int main( int argc, char* argv[] ) ...@@ -172,10 +182,17 @@ int main( int argc, char* argv[] )
bool isColorizeDisp, isFixedMaxDisp; bool isColorizeDisp, isFixedMaxDisp;
int imageMode; int imageMode;
bool retrievedImageFlags[5]; bool retrievedImageFlags[5];
parseCommandLine( argc, argv, isColorizeDisp, isFixedMaxDisp, imageMode, retrievedImageFlags ); string filename;
bool isVideoReading;
parseCommandLine( argc, argv, isColorizeDisp, isFixedMaxDisp, imageMode, retrievedImageFlags, filename, isVideoReading );
cout << "Device opening ..." << endl; cout << "Device opening ..." << endl;
VideoCapture capture( CV_CAP_OPENNI ); VideoCapture capture;
if( isVideoReading )
capture.open( filename );
else
capture.open( CV_CAP_OPENNI );
cout << "done." << endl; cout << "done." << endl;
if( !capture.isOpened() ) if( !capture.isOpened() )
...@@ -184,6 +201,8 @@ int main( int argc, char* argv[] ) ...@@ -184,6 +201,8 @@ int main( int argc, char* argv[] )
return -1; return -1;
} }
if( !isVideoReading )
{
bool modeRes=false; bool modeRes=false;
switch ( imageMode ) switch ( imageMode )
{ {
...@@ -201,13 +220,15 @@ int main( int argc, char* argv[] ) ...@@ -201,13 +220,15 @@ int main( int argc, char* argv[] )
} }
if (!modeRes) if (!modeRes)
cout << "\nThis image mode is not supported by the device, the default value (CV_CAP_OPENNI_SXGA_15HZ) will be used.\n" << endl; cout << "\nThis image mode is not supported by the device, the default value (CV_CAP_OPENNI_SXGA_15HZ) will be used.\n" << endl;
}
// Print some avalible device settings. // Print some avalible device settings.
cout << "\nDepth generator output mode:" << endl << cout << "\nDepth generator output mode:" << endl <<
"FRAME_WIDTH " << capture.get( CV_CAP_PROP_FRAME_WIDTH ) << endl << "FRAME_WIDTH " << capture.get( CV_CAP_PROP_FRAME_WIDTH ) << endl <<
"FRAME_HEIGHT " << capture.get( CV_CAP_PROP_FRAME_HEIGHT ) << endl << "FRAME_HEIGHT " << capture.get( CV_CAP_PROP_FRAME_HEIGHT ) << endl <<
"FRAME_MAX_DEPTH " << capture.get( CV_CAP_PROP_OPENNI_FRAME_MAX_DEPTH ) << " mm" << endl << "FRAME_MAX_DEPTH " << capture.get( CV_CAP_PROP_OPENNI_FRAME_MAX_DEPTH ) << " mm" << endl <<
"FPS " << capture.get( CV_CAP_PROP_FPS ) << endl; "FPS " << capture.get( CV_CAP_PROP_FPS ) << endl <<
"REGISTRATION " << capture.get( CV_CAP_PROP_OPENNI_REGISTRATION ) << endl;
if( capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR_PRESENT ) ) if( capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR_PRESENT ) )
{ {
cout << cout <<
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment