3

我正在裁剪一个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倍的新指针,而是保留相同的已分配块,将指针向前推进并将新img变量标记为不连续的。因此,我的 vtk 图像仍然从原始未裁剪的 Mat 中导入数据。我知道我可以将完整图像导入 vtkImageData,然后使用 vtk 过滤器进行裁剪,但我不希望这样做。

opencv 有没有办法获得“物理”裁剪的裁剪图像(使用新分配的数据指针)?

谢谢

4

1 回答 1

2

相信你正在寻找cv::Mat::clone()。它制作底层图像数据的深层副本并返回cv::Mat包含所述数据的对象。

然后你会改变线

img= img(roi);

img = img(roi).clone();

之后img只包含裁剪的数据。

于 2013-05-23T19:49:20.213 回答