gpt4 book ai didi

c++ - 将 vtkImageData 复制到 cv::Mat

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:01 24 4
gpt4 key购买 nike

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

虽然这是有效的,但它没有给我预期的输出(下面突出显示)。关于此事的任何帮助都会非常有帮助。

提前致谢,萨尔萨克

预期输出,

expected_output

我现在得到的输出,

actual_output

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

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

最佳答案

好的,所以直接在 vtkImageData 类上使用的 GetPointerToData() 函数或 GetScalarPointer() 函数不适合分配(在至少不是我能弄清楚的方式)。所以,我设计了另一种方法,

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 之间进行转换.. 我已经上传到代码here作为vtkOpenCVBridge

干杯!

关于c++ - 将 vtkImageData 复制到 cv::Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19891341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com