C++:我如何使用vtk库从vti网格中读取双精度标量数据?

huangapple go评论93阅读模式
英文:

c++: How can I read double scalar data from a vti grid using the vtk library?

问题

我正在尝试从我的vti文件中的网格中读取双精度(double)值。然而,从GetScalarPointer返回的值,在我尝试访问其中的任何元素时(例如scalarPtr[0]),会生成分段错误(segmentation fault):

  1. #include <vtkSmartPointer.h>
  2. #include <vtkXMLImageDataReader.h>
  3. #include <vtkImageData.h>
  4. int main(){
  5. vtkSmartPointer<vtkXMLImageDataReader> reader =
  6. vtkSmartPointer<vtkXMLImageDataReader>::New();
  7. reader->SetFileName("my_file.vti");
  8. reader->Update();
  9. vtkSmartPointer<vtkImageData> imageData = vtkSmartPointer<vtkImageData>::Take(reader->GetOutput());
  10. double* scalarPtr = static_cast<double*>(imageData->GetScalarPointer());
  11. std::cout << scalarPtr[0] << std::endl; // segmentation fault
  12. }

我知道类型是double,因为imageData->GetDataType()返回11,对应于VTK_DOUBLE

我还尝试了看是否是值的字节顺序导致的问题,但是下面的代码也导致分段错误,可能是因为scalarPtr不可访问:

  1. double* scalarPtr = static_cast<double*>(imageData->GetScalarPointer());
  2. const vtkIdType numScalars = imageData->GetNumberOfPoints();
  3. const int scalarSize = sizeof(double);
  4. vtkByteSwap::SwapVoidRange(scalarPtr, numScalars, scalarSize);

这是我的vtkImageData类的内容:

  1. vtkImageData (0x556e1ad5afd0)
  2. Debug: Off
  3. Modified Time: 307
  4. Reference Count: 1
  5. Registered Events: (none)
  6. Information: 0x556e1ad5b470
  7. Data Released: False
  8. Global Release Data: Off
  9. UpdateTime: 0
  10. Field Data:
  11. Debug: Off
  12. Modified Time: 307
  13. Reference Count: 1
  14. Registered Events: (none)
  15. Number Of Arrays: 1
  16. Array 0 name = comments
  17. Number Of Components: 1
  18. Number Of Tuples: 1
  19. Number Of Points: 2431
  20. Number Of Cells: 1920
  21. Cell Data:
  22. Debug: Off
  23. Modified Time: 302
  24. Reference Count: 1
  25. Registered Events:
  26. Registered Observers:
  27. vtkObserver (0x556e1ad5cb00)
  28. Event: 33
  29. EventName: ModifiedEvent
  30. Command: 0x556e1ad5c6a0
  31. Priority: 0
  32. Tag: 1
  33. Number Of Arrays: 1
  34. Array 0 name = material
  35. Number Of Components: 1
  36. Number Of Tuples: 1920
  37. Copy Tuple Flags: ( 1 1 1 1 1 0 1 1 1 1 1 )
  38. Interpolate Flags: ( 1 1 1 1 1 0 0 1 1 1 1 )
  39. Pass Through Flags: ( 1 1 1 1 1 1 1 1 1 1 1 )
  40. Scalars: (none)
  41. Vectors: (none)
  42. Normals: (none)
  43. TCoords: (none)
  44. Tensors: (none)
  45. GlobalIds: (none)
  46. PedigreeIds: (none)
  47. EdgeFlag: (none)
  48. Tangents: (none)
  49. RationalWeights: (none)
  50. HigherOrderDegrees: (none)
  51. Point Data:
  52. Debug: Off
  53. Modified Time: 304
  54. Reference Count: 1
  55. Registered Events:
  56. Registered Observers:
  57. vtkObserver (0x556e1ad5c8e0)
  58. Event: 33
  59. EventName: ModifiedEvent
  60. Command: 0x556e1ad5c6a0
  61. Priority: 0
  62. Tag: 1
  63. Number Of Arrays: 0
  64. Number Of Components: 0
  65. Number Of Tuples: 0
  66. Copy Tuple Flags: ( 1 1 1 1 1 0 1 1 1 1 1 )
  67. Interpolate Flags: ( 1 1 1 1 1 0 0 1 1 1 1 )
  68. Pass Through Flags: ( 1 1 1 1 1 1 1 1 1 1 1 )
  69. Scalars: (none)
  70. Vectors: (none)
  71. Normals: (none)
  72. TCoords: (none)
  73. Tensors: (none)
  74. GlobalIds: (none)
  75. PedigreeIds: (none)
  76. EdgeFlag: (none)
  77. Tangents: (none)
  78. RationalWeights: (none)
  79. HigherOrderDegrees: (none)
  80. Bounds:
  81. Xmin,Xmax: (0, 5e-06)
  82. Ymin,Ymax: (0, 8e-06)
  83. Zmin,Zmax: (0, 6e-06)
  84. Compute Time: 308
  85. Spacing: (5e-07, 5e-07, 5e-07)
  86. Origin: (0, 0, 0)
  87. Direction: (1, 0, 0, 0, 1, 0, 0, 0, 1)
  88. Dimensions: (11, 17, 13)
  89. Increments: (0, 0, 0)
  90. Extent: (0, 10, 0, 16, 0, 12)

在访问网格值方面,我可能存在什么问题?

英文:

I am trying to read the double values from a grid in my vti file. However, the return value I get from GetScalarPointer generates a segmentation fault when I try to access any element inside of it, e.g. with scalarPtr[0]:

  1. #include &lt;vtkSmartPointer.h&gt;
  2. #include &lt;vtkXMLImageDataReader.h&gt;
  3. #include &lt;vtkImageData.h&gt;
  4. int main(){
  5. vtkSmartPointer&lt;vtkXMLImageDataReader&gt; reader =
  6. vtkSmartPointer&lt;vtkXMLImageDataReader&gt;::New();
  7. reader-&gt;SetFileName(&quot;my_file.vti&quot;);
  8. reader-&gt;Update();
  9. vtkSmartPointer&lt;vtkImageData&gt; imageData = vtkSmartPointer&lt;vtkImageData&gt;::Take(reader-&gt;GetOutput());
  10. double* scalarPtr = static_cast&lt;double*&gt;(imageData-&gt;GetScalarPointer());
  11. std::cout &lt;&lt; scalarPtr[0] &lt;&lt; std::endl; // segmentation fault
  12. }

I know the type is double because imageData-&gt;GetDataType() returns 11, which corresponds to VTK_DOUBLE.

I also tried to see if it was due to the endianness of the values, but

  1. double* scalarPtr = static_cast&lt;double*&gt;(imageData-&gt;GetScalarPointer());
  2. const vtkIdType numScalars = imageData-&gt;GetNumberOfPoints();
  3. const int scalarSize = sizeof(double);
  4. vtkByteSwap::SwapVoidRange(scalarPtr, numScalars, scalarSize);

also results in a segmentation fault, probably because scalarPtr is not accessible.

These are the contents of my vtkImageData class:

  1. vtkImageData (0x556e1ad5afd0)
  2. Debug: Off
  3. Modified Time: 307
  4. Reference Count: 1
  5. Registered Events: (none)
  6. Information: 0x556e1ad5b470
  7. Data Released: False
  8. Global Release Data: Off
  9. UpdateTime: 0
  10. Field Data:
  11. Debug: Off
  12. Modified Time: 307
  13. Reference Count: 1
  14. Registered Events: (none)
  15. Number Of Arrays: 1
  16. Array 0 name = comments
  17. Number Of Components: 1
  18. Number Of Tuples: 1
  19. Number Of Points: 2431
  20. Number Of Cells: 1920
  21. Cell Data:
  22. Debug: Off
  23. Modified Time: 302
  24. Reference Count: 1
  25. Registered Events:
  26. Registered Observers:
  27. vtkObserver (0x556e1ad5cb00)
  28. Event: 33
  29. EventName: ModifiedEvent
  30. Command: 0x556e1ad5c6a0
  31. Priority: 0
  32. Tag: 1
  33. Number Of Arrays: 1
  34. Array 0 name = material
  35. Number Of Components: 1
  36. Number Of Tuples: 1920
  37. Copy Tuple Flags: ( 1 1 1 1 1 0 1 1 1 1 1 )
  38. Interpolate Flags: ( 1 1 1 1 1 0 0 1 1 1 1 )
  39. Pass Through Flags: ( 1 1 1 1 1 1 1 1 1 1 1 )
  40. Scalars: (none)
  41. Vectors: (none)
  42. Normals: (none)
  43. TCoords: (none)
  44. Tensors: (none)
  45. GlobalIds: (none)
  46. PedigreeIds: (none)
  47. EdgeFlag: (none)
  48. Tangents: (none)
  49. RationalWeights: (none)
  50. HigherOrderDegrees: (none)
  51. Point Data:
  52. Debug: Off
  53. Modified Time: 304
  54. Reference Count: 1
  55. Registered Events:
  56. Registered Observers:
  57. vtkObserver (0x556e1ad5c8e0)
  58. Event: 33
  59. EventName: ModifiedEvent
  60. Command: 0x556e1ad5c6a0
  61. Priority: 0
  62. Tag: 1
  63. Number Of Arrays: 0
  64. Number Of Components: 0
  65. Number Of Tuples: 0
  66. Copy Tuple Flags: ( 1 1 1 1 1 0 1 1 1 1 1 )
  67. Interpolate Flags: ( 1 1 1 1 1 0 0 1 1 1 1 )
  68. Pass Through Flags: ( 1 1 1 1 1 1 1 1 1 1 1 )
  69. Scalars: (none)
  70. Vectors: (none)
  71. Normals: (none)
  72. TCoords: (none)
  73. Tensors: (none)
  74. GlobalIds: (none)
  75. PedigreeIds: (none)
  76. EdgeFlag: (none)
  77. Tangents: (none)
  78. RationalWeights: (none)
  79. HigherOrderDegrees: (none)
  80. Bounds:
  81. Xmin,Xmax: (0, 5e-06)
  82. Ymin,Ymax: (0, 8e-06)
  83. Zmin,Zmax: (0, 6e-06)
  84. Compute Time: 308
  85. Spacing: (5e-07, 5e-07, 5e-07)
  86. Origin: (0, 0, 0)
  87. Direction: (1, 0, 0, 0, 1, 0, 0, 0, 1)
  88. Dimensions: (11, 17, 13)
  89. Increments: (0, 0, 0)
  90. Extent: (0, 10, 0, 16, 0, 12)

What am I doing wrong in terms of how I am accessing the grid values?

答案1

得分: 0

以下是代码的翻译部分:

解决方案是选择正确的XML嵌套级别,即ImageData -> CellData -> DataArray:

  1. #include <vtkSmartPointer.h>
  2. #include <vtkXMLImageDataReader.h>
  3. #include <vtkImageData.h>
  4. #include <vtkCellData.h>
  5. #include <vtkIntArray.h>
  6. int main() {
  7. vtkSmartPointer<vtkXMLImageDataReader> reader =
  8. vtkSmartPointer<vtkXMLImageDataReader>::New();
  9. reader->SetFileName("my_file.vti");
  10. reader->Update();
  11. vtkSmartPointer<vtkImageData> imageData = reader->GetOutput();
  12. vtkSmartPointer<vtkCellData> cellData = imageData->GetCellData();
  13. vtkSmartPointer<vtkDataArray> dataArray = cellData->GetArray("material");
  14. int dims[3];
  15. imageData->GetDimensions(dims);
  16. for (int i = 0; i < 3; ++i) dims[i] = dims[i] - 1;
  17. for (int k = 0; k <= dims[2]; k++) {
  18. for (int j = 0; j <= dims[1]; j++) {
  19. for (int i = 0; i <= dims[0]; i++) {
  20. double value = dataArray->GetComponent(
  21. i + j * dims[0] + k * dims[0] * dims[1], 0);
  22. std::cout << "Value at (" << i << ", " << j << ", " << k << "): "
  23. << value << std::endl;
  24. }
  25. }
  26. }
  27. }

希望这对你有所帮助。如果你有任何其他问题,可以随时提出。

英文:

The solution was to select the correct XML nesting level, which was ImageData -> CellData -> DataArray:

  1. #include &lt;vtkSmartPointer.h&gt;
  2. #include &lt;vtkXMLImageDataReader.h&gt;
  3. #include &lt;vtkImageData.h&gt;
  4. #include &lt;vtkCellData.h&gt;
  5. #include &lt;vtkIntArray.h&gt;
  6. int main(){
  7. vtkSmartPointer&lt;vtkXMLImageDataReader&gt; reader =
  8. vtkSmartPointer&lt;vtkXMLImageDataReader&gt;::New();
  9. reader-&gt;SetFileName(&quot;my_file.vti&quot;);
  10. reader-&gt;Update();
  11. vtkSmartPointer&lt;vtkImageData&gt; imageData = reader-&gt;GetOutput();
  12. vtkSmartPointer&lt;vtkCellData&gt; cellData = imageData-&gt;GetCellData();
  13. vtkSmartPointer&lt;vtkDataArray&gt; dataArray = cellData-&gt;GetArray(&quot;material&quot;);
  14. int dims[3];
  15. imageData-&gt;GetDimensions(dims);
  16. for (int i = 0; i &lt; 3; ++i) dims[i] = dims[i]-1;
  17. for (int k = 0; k &lt;= dims[2]; k++) {
  18. for (int j = 0; j &lt;= dims[1]; j++) {
  19. for (int i = 0; i &lt;= dims[0]; i++) {
  20. double value = dataArray-&gt;GetComponent(
  21. i + j * dims[0] + k * dims[0] * dims[1], 0);
  22. std::cout &lt;&lt; &quot;Value at (&quot; &lt;&lt; i &lt;&lt; &quot;, &quot; &lt;&lt; j &lt;&lt; &quot;, &quot; &lt;&lt; k &lt;&lt; &quot;): &quot;
  23. &lt;&lt; value &lt;&lt; std::endl;
  24. }
  25. }
  26. }
  27. }

huangapple
  • 本文由 发表于 2023年3月3日 23:08:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/75628757.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定