Мне нужно сгенерировать oni-файл с изображения rgb и глубины. Я использовал образец NiRecordSynthetic от openni. Он работает правильно для моего изображения глубины, но когда я добавляю функцию transformImageMD для своего изображения RGB, я получаю ошибку сегментации в imageMap (x, y) = imagePixel. Я не знаю почему.конвертировать изображение rgb depth в файл oni
вот мой код:
void transformDepthMD(Mat FrameDepth,DepthMetaData& depthMD)
{
DepthMap& depthMap = depthMD.WritableDepthMap();
for (XnUInt32 y = 0; y < depthMap.YRes(); y++)
{
for (XnUInt32 x = 0; x < depthMap.XRes(); x++)
{
//Punch vertical cut lines in the depth image
if ((x % 2) == 0)
{
depthMap(x,y) = FrameDepth.at<XnUInt16>(y,x);
}
}
}
}
void transformImageMD(Mat FrameImage,ImageMetaData& imageMD)
{
RGB24Map& imageMap = imageMD.WritableRGB24Map();
for (XnUInt32 y = 0; y < imageMD.YRes(); y++)
{
for (XnUInt32 x = 0; x <imageMD.XRes(); x++)
{
XnRGB24Pixel imagePixel;
imagePixel.nBlue=FrameImage.at<Vec3b>(y,x)[0];
imagePixel.nGreen=FrameImage.at<Vec3b>(y,x)[1];
imagePixel.nRed=FrameImage.at<Vec3b>(y,x)[2];
imageMap(x,y) = imagePixel;
}
}
}
int main(int argc, char* argv[])
{
XnStatus nRetVal = XN_STATUS_OK;
nRetVal = xnLogInitFromXmlFile(SAMPLE_XML_PATH);
if (nRetVal != XN_STATUS_OK)
{
printf("Log couldn't be opened: %s. Running without log", xnGetStatusString(nRetVal));
}
if (argc < 3)
{
printf("usage: %s <inputFile> <outputFile>\n", argv[0]);
return -1;
}
const char* strInputFile = argv[1];
const char* strOutputFile = argv[2];
Context context;
nRetVal = context.Init();
CHECK_RC(nRetVal, "Init");
// open input file
Player player;
nRetVal = context.OpenFileRecording(strInputFile, player);
CHECK_RC(nRetVal, "Open input file");
// Get depth node from recording
DepthGenerator depth;
nRetVal = context.FindExistingNode(XN_NODE_TYPE_DEPTH, depth);
CHECK_RC(nRetVal, "Find depth generator");
// Create mock node based on depth node from recording
MockDepthGenerator mockDepth;
nRetVal = mockDepth.CreateBasedOn(depth);
CHECK_RC(nRetVal, "Create mock depth node");
ImageGenerator image;
nRetVal = context.FindExistingNode(XN_NODE_TYPE_IMAGE, image);
CHECK_RC(nRetVal, "Find depth generator");
// Create mock node based on depth node from recording
MockImageGenerator mockImage;
nRetVal = mockImage.CreateBasedOn(image);
CHECK_RC(nRetVal, "Create mock depth node");
// create recorder
Recorder recorder;
nRetVal = recorder.Create(context);
CHECK_RC(nRetVal, "Create recorder");
nRetVal = recorder.SetDestination(XN_RECORD_MEDIUM_FILE, strOutputFile);
CHECK_RC(nRetVal, "Set recorder destination file");
// add depth node to recorder
nRetVal = recorder.AddNodeToRecording(mockDepth);
CHECK_RC(nRetVal, "Add node to recording");
nRetVal = recorder.AddNodeToRecording(mockImage);
CHECK_RC(nRetVal, "Add node to recording");
nRetVal = player.SetRepeat(FALSE);
XN_IS_STATUS_OK(nRetVal);
XnUInt32 nNumFrames = 0;
nRetVal = player.GetNumFrames(image.GetName(), nNumFrames);
CHECK_RC(nRetVal, "Get player number of frames");
DepthMetaData depthMD;
ImageMetaData imageMD;
int frameNum = 0;
String path = "myData";
while ((nRetVal = depth.WaitAndUpdateData()) != XN_STATUS_EOF)
{
++frameNum;
CHECK_RC(nRetVal, "Read next frame");
// Get depth meta data
depth.GetMetaData(depthMD);
image.GetMetaData(imageMD);
nRetVal = depthMD.MakeDataWritable();
CHECK_RC(nRetVal, "Make depth data writable");
nRetVal = imageMD.MakeDataWritable();
CHECK_RC(nRetVal, "Make depth data writable");
String ficheroActualRGB;
ficheroActualRGB = path +"RGB_" + boost::to_string(frameNum) + ".png";
String ficheroActualDepth = path +"Depth_"+ boost::to_string(frameNum) + ".png";
Mat matFrameImage = imread(ficheroActualRGB, 1);
resize(matFrameImage, matFrameImage, Size(640, 480), 0, 0, INTER_CUBIC);
Mat matFrameDepth = imread(ficheroActualDepth,1);
resize(matFrameDepth, matFrameDepth, Size(640, 480), 0, 0, INTER_CUBIC);
transformDepthMD(matFrameDepth,depthMD);
transformImageMD(matFrameImage,imageMD);
// Pass the transformed data to the mock depth generator
nRetVal = mockDepth.SetData(depthMD);
CHECK_RC(nRetVal, "Set mock node new data");
nRetVal = mockImage.SetData(imageMD);
CHECK_RC(nRetVal, "Set mock node new data");
/* We need to call recorder.Record explicitly because we're not using WaitAndUpdateAll(). */
nRetVal = recorder.Record();
CHECK_RC(nRetVal, "Record");
printf("Recorded: frame %u out of %u\r", depthMD.FrameID(), nNumFrames);
}
printf("\n");
return 0;
}
Спасибо,
Возможно, проверьте, имеют ли 'FrameImage' и' depthMD' и/или 'imageMD' одинаковые размеры? – Galik
да, оба они имеют одинаковые размеры. Кажется, что imageMap имеет значение null, потому что он не может поместить imagePixel в imageMap, но когда я показываю imageMD.Yres и imageMD.Xres, он показывает 640 и 480 одинакового размера моего изображения. –