Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ITK/C++;-can';我不能让它工作 我对ITK和C++都是新手,目前正在为图像配准算法设置一个测试程序。在我的信息中,我将详细介绍我在使用ITK术语时所做的工作。然而,我希望任何有经验的C++程序员都能够在不了解ITK细节的情况下判断出我的代码有什么问题,因为我认为我只是在引用/取消引用时做了一些错误的事情。这里需要跟踪的是MetaDataContainer类型变量(在所有函数中称为metaData)(下面将详细解释)。如果ITK的任何细节让你困惑,请询问更多细节,但我不想让这条原始信息太长。不管怎样,下面是:_C++_Pointers_Itk - Fatal编程技术网

在ITK/C++;-can';我不能让它工作 我对ITK和C++都是新手,目前正在为图像配准算法设置一个测试程序。在我的信息中,我将详细介绍我在使用ITK术语时所做的工作。然而,我希望任何有经验的C++程序员都能够在不了解ITK细节的情况下判断出我的代码有什么问题,因为我认为我只是在引用/取消引用时做了一些错误的事情。这里需要跟踪的是MetaDataContainer类型变量(在所有函数中称为metaData)(下面将详细解释)。如果ITK的任何细节让你困惑,请询问更多细节,但我不想让这条原始信息太长。不管怎样,下面是:

在ITK/C++;-can';我不能让它工作 我对ITK和C++都是新手,目前正在为图像配准算法设置一个测试程序。在我的信息中,我将详细介绍我在使用ITK术语时所做的工作。然而,我希望任何有经验的C++程序员都能够在不了解ITK细节的情况下判断出我的代码有什么问题,因为我认为我只是在引用/取消引用时做了一些错误的事情。这里需要跟踪的是MetaDataContainer类型变量(在所有函数中称为metaData)(下面将详细解释)。如果ITK的任何细节让你困惑,请询问更多细节,但我不想让这条原始信息太长。不管怎样,下面是:,c++,pointers,itk,C++,Pointers,Itk,在程序执行过程中,我必须多次读取和写入dicom图像,因此我决定为它们编写单独的函数,而不是每次都执行读取/写入过程的所有步骤。由于我必须使用读取过程中的一些数据,例如输出中的MetaDataDictionaryArray,readDicom函数(以及另一个函数preregistrationOperations)返回一个元组: typedef std::tuple< ImageType::Pointer, MetaDataContainer, FileNamesContainer >

在程序执行过程中,我必须多次读取和写入dicom图像,因此我决定为它们编写单独的函数,而不是每次都执行读取/写入过程的所有步骤。由于我必须使用读取过程中的一些数据,例如输出中的MetaDataDictionaryArray,readDicom函数(以及另一个函数preregistrationOperations)返回一个元组:

typedef std::tuple< ImageType::Pointer, MetaDataContainer, FileNamesContainer > ImageMetaOutputTuple;
-

-

-


可能是GetMetaDataDictionaryArray只返回序列读取器成员的原始指针,但当您退出readDicom时,读取器将超出范围。在这种情况下,我希望你有更多的错误,但也许这是一个值得研究的方向。 您可以在函数中添加4个额外的参数来存储结果,而不是返回元组(以便于调试)


触摸字典总是令人讨厌的,下面是一个例子(但在这里,他们逐条阅读字典)。您确定需要更新它吗?某些字段将由dicom编写器自动更新(例如方向),但您不能强制这些字段

您说程序在writeDicom函数中崩溃,并显示消息“…向量下标超出范围”,但所示的
writeDicom
行似乎只将指针传递给另一个函数。你确定程序在那一行崩溃了吗?@user207933,它在显示的包含命令
seriesWriter->Update()的行之后立即在try-catch块中崩溃当我在readDicom内部将metaData-Zsize()打印到标准输出时,它是64,这是正确的,因为我有64个DICOM图像,但是当我在其他函数中打印它的大小时,它是0,所以当我从readDicom返回它时,出现了一些问题。我删除了我的答案,因为它似乎是错误的。我要在这里补充一点,尽管typedeffing指针是个坏主意。框架似乎做到了这一点,所以保留约定是可以的,但您至少应该命名您的typedef
MetaDataContainerPtr
或类似名称。@user207933注意,但正如您所说,框架做到了这一点,我使用了与官方示例中完全相同的typedeff约定。也就是说,他们使用MetaDataContainer作为Dicom示例中完全相同的typedef,作为标准itk类头文件中包含的typedef的附加typedef。这是一个有点奇怪的选择,因为他们似乎对所有其他指针typedef使用…RawPointer,但选择是他们的错。
typedef MetaDataDictionary                  DictionaryType;
typedef MetaDataDictionary *                DictionaryRawPointer;
typedef std::vector< DictionaryRawPointer > DictionaryArrayType;
typedef const DictionaryArrayType *         DictionaryArrayRawPointer;
typedef itk::ImageSeriesWriter< ImageType, Image2DType >::DictionaryArrayRawPointer  MetaDataContainer;
ImageMetaOutputTuple preRegistrationOperations( std::string inputDir,  std::string outputDir, std::string seriesNumber, bool preparationsDone = false, bool verbose = true )
{ 
   // No output verbose if operations have already been done
   if (preparationsDone) verbose = false;

   // Read input-Dicoms
   ImageType::Pointer image;
   MetaDataContainer metaData;
   FileNamesContainer outputFilenames; 
   ImageMetaOutputTuple returnTuple = readDicom( inputDir, outputDir, seriesNumber, verbose );
   std::tie (image, metaData, outputFilenames) = returnTuple;    

   // Pass image and directory and filename information to writeDicom and write into outputDir
   if (!preparationsDone) {                
          try {
                 int resultCode = writeDicom( image, outputDir, outputFilenames, metaData );
          }
          catch (itk::ExceptionObject &ex) {
                 std::cout << "Exception caught in writeDICOM:" << std::endl;
                 std::cout << ex << std::endl;            
          }      
   }      
   return returnTuple;
}
int writeDicom ( ImageType::Pointer image, std::string inputDir, FileNamesContainer filenames, MetaDataContainer metaData )
{ 
            …
            seriesWriter->SetMetaDataDictionaryArray( metaData );  
            try {       
                 seriesWriter->Update();        
                 return 0;
               }
            catch {
                   ...
                  }
   …
}
ImageMetaOutputTuple readDicom ( std::string inputDir, std::string outputDir = "", std::string seriesNumber = "", bool verbose = true)
{      
   …
   image = reader->GetOutput();
   files = nameGenerator->GetOutputFileNames();
   MetaDataContainer metaData = reader->GetMetaDataDictionaryArray();
          …
ImageMetaOutputTuple returnTuple (image, metaData, files);
return returnTuple;
}
int main( int argc, char* argv[] )
{
   …
   ImageType::Pointer moving; 
   ImageType::Pointer target;
   std::tie(moving, std::ignore, std::ignore) = preRegistrationOperations( inputDir, movingDir, movingSeriesNumber, preparationsDone, verbose );       
   std::tie(target, std::ignore, std::ignore) = preRegistrationOperations( inputDir, targetDir, targetSeriesNumber, preparationsDone, verbose );       
   …
}