我正在裁剪一个opencv Mat:
cv::Size size = img.size();
cv::Rect roi(size.width*/4., size.height/4.,size.width/2., size.height/.2);
img= img(roi);
然后我使用img.data
指针创建vtkImageData
(通过vtkImageImport
):
vtkSmartPointer<vtkImageImport> importer = vtkSmartPointer<vtkImageImport>::New();
importer->SetImportVoidPointer(img.data);
...
importer->Update();
vtkImageData* vtkImg = importer->GetOutput();
当我显示vtkImg时,我没有得到预期的结果。我已经深入研究了opencv的代码,问题是在创建裁剪数据时,opencv不会分配一个小4倍的新指针,而是保持相同的已分配块,将指针向上游推进并标记新的{{1变量不连续。因此,我的vtk图像仍然从原始未剪切的Mat中导入数据。我知道我可以将完整的图像导入vtkImageData,然后使用vtk过滤器进行裁剪,但我不愿意。
opencv是否有办法获得“物理”裁剪的裁剪图像(使用新分配的数据指针)?
谢谢
答案 0 :(得分:1)
我相信你正在寻找cv::Mat::clone()
。它会对底层图像数据进行深层复制,并返回包含所述数据的cv::Mat
对象。
然后您将更改行
img= img(roi);
到
img = img(roi).clone();
之后img
仅包含裁剪数据。