我正在尝试将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
预期产出,
我现在得到的输出,
编辑: 我意识到图像大小不一样。这是因为我刚刚发布了我正在使用的查看器中的数据快照..在给定HERE的保管箱链接中有一个示例。希望这能澄清一些事情......
TAGS:vtk opencv bridge,vtkopencv,vtk opencv integration
答案 0 :(得分:3)
好的,所以直接在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 :: Mat 和/或 cv :: gpu :: Mat 进行转换..我已将代码here上传为
干杯!
答案 1 :(得分:0)
首先,图像的大小不同。即使数据未正确存储,图像的至少宽度和高度也应相同。这意味着dims [0]和dims [1]实际上并不是图像的高度和宽度。
其次,您确定vtk图像中的数据是否存储为unsigned char数组?当我试图在无符号字符的图像中存储整数图像时,我得到的图案类似于你的图案。
第三,你确定你的vtk图像在内存中是连续的(你没有在下面的行之间提供步骤)吗?
我从未使用过VTK库,所以我的回答只是一个猜测......
答案 2 :(得分:0)
我遇到过类似的问题,花了很多时间后,我意识到我已经换了尺寸,高度和宽度等等。正确恢复尺寸确实给了我更好的结果。我没有使用VTK库,但我认为你可以重新检查维度声明。