我正在尝试将vtkImageData *类复制到cv :: Mat结构中[我的目标是将MHD文件读入OpenCV]。该文件本质上是3D矩阵,所以我想获得一个包含所有切片的向量。卷。到目前为止,我已经提出了这段代码,
reader->SetFileName(INPUT_DATA_1.c_str());
reader->Update();
imageData_1 = reader->GetOutput();
extractVOI->SetInput(imageData_1);
int dims[3];
imageData_1->GetDimensions(dims);
extractVOI->SetVOI(0, dims[0], 0, dims[1], 75, 75); // Set it to z=75
extractVOI->GetOutput()->SetScalarTypeToSignedChar();
imageExport->SetInputConnection(extractVOI->GetOutputPort());
imageExport->Update();
cv::Mat cvMat_test(dims[0], dims[1], CV_8UC1, imageExport->GetPointerToData());
尽管这是可行的,但并没有给我带来预期的输出(在下面突出显示)。有关此问题的任何帮助将非常有帮助。
在此先感谢,Sarthak
预期输出
我现在得到的输出,
编辑:我意识到图像是不一样的大小。这是因为我刚刚从正在使用的查看器中发布了数据快照。.在保管箱链接中提供了一个示例,此处为。希望这能使事情更清楚。
标签:vtk opencv网桥,vtkopencv,vtk opencv集成
好的,所以直接在类上使用的一个GetPointerToData()
或多个GetScalarPointer()
函数vtkImageData
不适合分配(至少不适合我确定的方式)。所以,我设计了另一种方法,
reader->SetFileName(INPUT_DATA_1.c_str());
reader->Update();
imageData_1 = reader->GetOutput();
extractVOI->SetInput(imageData_1);
int dims[3];
imageData_1->GetDimensions(dims);
extractVOI->SetVOI(0, dims[0], 0, dims[1], 75, 75); // Set it to z=75
extractVOI->GetOutput()->SetScalarTypeToSignedChar();
cv::Mat cvMat_test(dims[0], dims[1], CV_8UC1);
for (int i=0; i<dims[0]; ++i) {
for (int j=0; j<dims[1]; ++j) {
cvMat_test.at<unsigned char>(cv::Point(j,i)) = *static_cast<unsigned char*>(extractVOI->GetOutput()->GetScalarPointer(i,j,vol_dim));
}
}
我猜想这种方法可以很容易地扩展到包括整个体积。
编辑:
我伸出我的代码做的转换和从vtkImageData和CV ::垫和/或CV :: GPU ::垫..我已经上传的代码在这里为vtkOpenCVBridge。
干杯。!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句