Доступ к нарушению чтения при записи DICOM с помощью vtkDICOMWriter - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь записать vtkImageData как DICOM. Я продолжаю получать «Нарушение прав доступа при чтении», когда пытаюсь написать изображение.

Необработанное исключение в 0x00007FFDA30ECA50: 0xC0000005: Место чтения нарушения доступа 0x000001BD38D5C000

Вот мой код:

vtkSmartPointer<vtkDICOMWriter> dcmWriter = vtkSmartPointer<vtkDICOMWriter>::New();
dcmWriter->SetInputData(testDat);
dcmWriter->SetFileName(fullPath.toStdString().c_str());
dcmWriter->Update(); // this line breaks
dcmWriter->Write(); 

testDat является типом vtkSmartPointer<vtkImageData> и содержит данные. Есть мысли о том, что вызвало ошибку? Я не могу найти ничего похожего в Интернете.

Я последовал этому примеру: https://github.com/dgobbi/vtk-dicom/blob/master/Examples/TestDICOMWriter.cxx

У меня нет метаданных, но это не должно быть проблемой.

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Эти строки взяты из приведенного вами примера:

writer->SetFilePrefix("/tmp");
writer->SetFilePattern("%s/IM-0001-%04.4d.dcm");

, и вы используете

dcmWriter->SetFileName(fullPath.toStdString().c_str());

Кажется, что vtkDICOMWriter записывает несколько файлов, поэтому вам, вероятно, необходимо предоставить шаблон файла.В любом случае, трудно догадаться, почему это приводит к ошибке чтения, и трудно помочь, если вы не публикуете полный рабочий пример.

И, наконец, vtkDICOMWriter не является классом от vtk, он был выпущен отдельно (кажется) в 2017 году. Это означает, что он не тестируется на остальной части VTK при каждом новом выпуске.

0 голосов
/ 29 мая 2019

Мне нужно сделать некоторые предположения, потому что вы не опубликовали весь свой код, но я подозреваю, что проблема возникает в следующей строке:

dcmWriter->SetFileName(fullPath.toStdString().c_str());

toStdString(), скорее всего, возвращает временный std::string (fullPath выглядит как Qt QString), на который вы звоните c_str(). После этого утверждения ваш временный объект уничтожается, и все, что вы передали SetFileName, теперь является висящим указателем. Отсюда и ошибка.

Попробуйте вместо этого следующее:

const auto pathString = fullPath.toStdString();
dcmWriter->SetFileName(pathString.c_str());

Надеюсь, это должно работать нормально. Даже если это не так, это определенно проблема с вашим кодом.

...