C++ Vtk读取dicom文件

C++ Vtk读取dicom文件,c++,vtk,dicom,C++,Vtk,Dicom,我试图遍历dicom文件中的所有像素。目前,我正在使用一个演示: int main(int argc, char* argv[]) { std::string inputFilename = "MR000000"; // Read all the DICOM files in the specified directory. vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkD

我试图遍历dicom文件中的所有像素。目前,我正在使用一个演示:

int main(int argc, char* argv[])
{
  std::string inputFilename = "MR000000";

//   Read all the DICOM files in the specified directory.
  vtkSmartPointer<vtkDICOMImageReader> reader =
    vtkSmartPointer<vtkDICOMImageReader>::New();
 reader->SetFileName(inputFilename.c_str());
reader->Update();

// Visualize
vtkSmartPointer<vtkImageViewer2> imageViewer =
vtkSmartPointer<vtkImageViewer2>::New();
imageViewer->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
imageViewer->SetupInteractor(renderWindowInteractor);
imageViewer->Render();
imageViewer->GetRenderer()->ResetCamera();
imageViewer->Render();

 renderWindowInteractor->Start();

return EXIT_SUCCESS;
}
intmain(intargc,char*argv[])
{
std::string inputFilename=“MR000000”;
//读取指定目录中的所有DICOM文件。
VTKSmart指针读取器=
vtkSmartPointer::New();
reader->SetFileName(inputFilename.c_str());
阅读器->更新();
//想象
vtkSmartPointer图像查看器=
vtkSmartPointer::New();
imageViewer->SetInputConnection(读卡器->GetOutputPort());
vtkSmartPointer渲染器Windows WinterActor=
vtkSmartPointer::New();
imageViewer->SetupInteractor(RenderWindowActor);
imageViewer->Render();
imageViewer->GetRenderer()->ResetCamera();
imageViewer->Render();
renderWindowInteractor->Start();
返回退出成功;
}

这里有一种从读卡器对象获取像素数组的方法吗?

vtkImageViewer2
有一个
GetIntput()
方法,该方法返回一个
vtkImageData
实例。 我想这个方法应该在调用
imageViewer->Render()之后使用

从中可以检索图像的每个组件。 您需要通过
imageData->GetScalarPointer(x,y,z)
调整返回组件的类型;使用
imageData->GetScalarType()
imageData->GetNumberOfScalarComponents()


请注意,vtkImageViewer2不是您想要的,vtkDICOMImageReader更适合:

以下是一些应该有所帮助的来源(这涉及到pcl点,但实际上是相同的):

vtkSmartPointer=vtkSmartPointer::New();
vtkSmartPointer sliceData=vtkSmartPointer::New();
reader->SetFileName(dicomFile.c_str());
阅读器->更新();
sliceData=reader->GetOutput();
int numberOfDims=sliceData->GetDataDimension();
int*dims=sliceData->GetDimensions();
double*spacingData=reader->getDataSpace();
对于(int y=0;yGetScalarComponentAsDouble(x,y,z,0);
如果(!isinf(温度强度))
{
tempPt.intensity=tempIntensity;
}
其他的
{
温度强度=0;
}
云->点。向后推(tempPt);
}
}

我在
vtkImageViewer2
中找不到
GetOutput()
函数。谢谢,我修改了答案以更改方法名称。
vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
vtkSmartPointer<vtkImageData> sliceData = vtkSmartPointer<vtkImageData>::New();
reader->SetFileName(dicomFile.c_str());
reader->Update();
sliceData = reader->GetOutput();

int numberOfDims = sliceData->GetDataDimension();
int * dims = sliceData->GetDimensions();
double* spacingData = reader->GetDataSpacing();

for (int y = 0; y < dims[1]; y++)
        {
            for (int x = 0; x < dims[0]; x++)
            {
                pcl::PointXYZI tempPt = pcl::PointXYZI();
                tempPt.x = x * spacingData[0];
                tempPt.y = y * spacingData[1];
                tempPt.z = 0;
                double tempIntensity = sliceData->GetScalarComponentAsDouble(x, y, z, 0);
                if (!isinf(tempIntensity))
                {
                    tempPt.intensity = tempIntensity;
                }
                else
                {
                    tempPt.intensity = 0;
                }

                cloud->points.push_back(tempPt);
            }
        }