将vtkImageData复制到cv :: Mat

时间:2013-11-10 15:11:59

标签: c++ visual-studio-2010 opencv 64-bit vtk

我正在尝试将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

预期产出,

expected_output

我现在得到的输出,

actual_output

编辑: 我意识到图像大小不一样。这是因为我刚刚发布了我正在使用的查看器中的数据快照..在给定HERE的保管箱链接中有一个示例。希望这能澄清一些事情......

TAGS:vtk opencv bridge,vtkopencv,vtk opencv integration

3 个答案:

答案 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上传为 vtkOpenCVBridge 。

干杯!

答案 1 :(得分:0)

首先,图像的大小不同。即使数据未正确存储,图像的至少宽度和高度也应相同。这意味着dims [0]和dims [1]实际上并不是图像的高度和宽度。

其次,您确定vtk图像中的数据是否存储为unsigned char数组?当我试图在无符号字符的图像中存储整数图像时,我得到的图案类似于你的图案。

第三,你确定你的vtk图像在内存中是连续的(你没有在下面的行之间提供步骤)吗?

我从未使用过VTK库,所以我的回答只是一个猜测......

答案 2 :(得分:0)

我遇到过类似的问题,花了很多时间后,我意识到我已经换了尺寸,高度和宽度等等。正确恢复尺寸确实给了我更好的结果。我没有使用VTK库,但我认为你可以重新检查维度声明。