3

私はopencvマットを切り取っています:

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 イメージは元のクロップされていないマットからデータをインポートします。画像全体を 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 に答える