4

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

虽然这是可行的,但它并没有给我预期的输出(下面突出显示)..关于这个问题的任何帮助都会非常有帮助..

提前致谢, 萨塔克

预期输出,

预期输出

我现在得到的输出,

实际输出

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

标签:vtk opencv 桥,vtkopencv,vtk opencv 集成

4

3 回答 3

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));
    }
}

我猜这个方法可以很容易地扩展到包括整个卷..

编辑:

我扩展了我的代码以在vtkImageDatacv::Mat和/或cv::gpu::Mat之间进行转换。我已将代码上传到此处作为vtkOpenCVBridge

干杯。!

于 2013-11-12T18:10:24.037 回答
0

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

其次,您确定 vtk 图像中的数据存储为无符号字符数组吗?当我尝试将整数图像存储在无符号字符的图像中时,我得到了与您类似的模式。

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

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

于 2013-11-12T12:47:35.570 回答
0

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

于 2013-11-14T09:39:30.593 回答