From 77165d53b98464c65d4f8dbf018c0808854052de Mon Sep 17 00:00:00 2001 From: amaclean Date: Tue, 21 Apr 2026 15:58:08 +1000 Subject: [PATCH 1/2] Crashes when a PNG image is loaded It seems to be an vtkAOSDataArrayTemplate issue --- src/Cxx/Images/ImageContinuousDilate3D.cxx | 41 +++++++++---------- src/Cxx/Images/ImageContinuousErode3D.cxx | 37 ++++++++--------- .../Images/ImageContinuousDilate3D.py | 10 ++--- .../Images/ImageContinuousErode3D.py | 12 +++--- 4 files changed, 45 insertions(+), 55 deletions(-) diff --git a/src/Cxx/Images/ImageContinuousDilate3D.cxx b/src/Cxx/Images/ImageContinuousDilate3D.cxx index cb9041ee21a..a599a3baaa8 100644 --- a/src/Cxx/Images/ImageContinuousDilate3D.cxx +++ b/src/Cxx/Images/ImageContinuousDilate3D.cxx @@ -3,9 +3,10 @@ #include #include #include +#include +#include #include #include -#include #include #include #include @@ -21,50 +22,46 @@ int main(int argc, char* argv[]) if (argc < 2) { - std::array drawColor1{0, 0, 0}; - std::array drawColor2{0, 0, 0}; - auto color1 = colors->GetColor3ub("Black").GetData(); - auto color2 = colors->GetColor3ub("Red").GetData(); - for (auto i = 0; i < 3; ++i) - { - drawColor1[i] = color1[i]; - drawColor2[i] = color2[i]; - } + auto color1 = colors->GetColor3ub("Black"); + std::array drawColor1{color1.GetRed(), color1.GetGreen(), + color1.GetBlue()}; + auto color2 = colors->GetColor3ub("Red"); + std::array drawColor2{color2.GetRed(), color2.GetGreen(), + color2.GetBlue()}; // Create an image vtkNew source; source->SetScalarTypeToUnsignedChar(); source->SetExtent(0, 200, 0, 200, 0, 0); - source->SetDrawColor(drawColor1.data()); + source->SetDrawColor(drawColor1[0], drawColor1[1], drawColor1[1]); source->FillBox(0, 200, 0, 200); - source->SetDrawColor(drawColor2.data()); + source->SetDrawColor(drawColor2[0], drawColor2[1], drawColor2[1]); source->FillBox(100, 150, 100, 150); source->Update(); image->ShallowCopy(source->GetOutput()); } else { - vtkNew reader; + // Read the image + vtkNew readerFactory; + vtkSmartPointer reader; + reader.TakeReference(readerFactory->CreateImageReader2(argv[1])); reader->SetFileName(argv[1]); reader->Update(); image->ShallowCopy(reader->GetOutput()); } - - vtkNew dilateFilter; - dilateFilter->SetInputData(image); - dilateFilter->SetKernelSize(10, 10, 1); - dilateFilter->Update(); - vtkNew originalMapper; originalMapper->SetInputData(image); - originalMapper->Update(); vtkNew originalActor; originalActor->SetMapper(originalMapper); + vtkNew dilateFilter; + dilateFilter->SetInputData(image); + vtkNew dilatedMapper; dilatedMapper->SetInputConnection(dilateFilter->GetOutputPort()); - dilatedMapper->Update(); + dilatedMapper->SetInputData(image); vtkNew dilatedActor; dilatedActor->SetMapper(dilatedMapper); @@ -91,7 +88,7 @@ int main(int argc, char* argv[]) rightRenderer->SetBackground(colors->GetColor3d("RoyalBlue").GetData()); leftRenderer->AddActor(originalActor); - rightRenderer->AddActor(dilatedActor); + // rightRenderer->AddActor(dilatedActor); leftRenderer->ResetCamera(); rightRenderer->SetActiveCamera(leftRenderer->GetActiveCamera()); diff --git a/src/Cxx/Images/ImageContinuousErode3D.cxx b/src/Cxx/Images/ImageContinuousErode3D.cxx index d458a13baab..34c27e2a5ae 100644 --- a/src/Cxx/Images/ImageContinuousErode3D.cxx +++ b/src/Cxx/Images/ImageContinuousErode3D.cxx @@ -3,9 +3,10 @@ #include #include #include +#include +#include #include #include -#include #include #include #include @@ -21,50 +22,46 @@ int main(int argc, char* argv[]) if (argc < 2) { - std::array drawColor1{0, 0, 0}; - std::array drawColor2{0, 0, 0}; - auto color1 = colors->GetColor3ub("Black").GetData(); - auto color2 = colors->GetColor3ub("Red").GetData(); - for (auto i = 0; i < 3; ++i) - { - drawColor1[i] = color1[i]; - drawColor2[i] = color2[i]; - } + auto color1 = colors->GetColor3ub("Black"); + std::array drawColor1{color1.GetRed(), color1.GetGreen(), + color1.GetBlue()}; + auto color2 = colors->GetColor3ub("Red"); + std::array drawColor2{color2.GetRed(), color2.GetGreen(), + color2.GetBlue()}; // Create an image vtkNew source; source->SetScalarTypeToUnsignedChar(); source->SetExtent(0, 200, 0, 200, 0, 0); - source->SetDrawColor(drawColor1.data()); + source->SetDrawColor(drawColor1[0], drawColor1[1], drawColor1[1]); source->FillBox(0, 200, 0, 200); - source->SetDrawColor(drawColor2.data()); + source->SetDrawColor(drawColor2[0], drawColor2[1], drawColor2[1]); source->FillBox(100, 150, 100, 150); source->Update(); image->ShallowCopy(source->GetOutput()); } else { - vtkNew reader; + vtkNew readerFactory; + vtkSmartPointer reader; + reader.TakeReference(readerFactory->CreateImageReader2(argv[1])); reader->SetFileName(argv[1]); reader->Update(); image->ShallowCopy(reader->GetOutput()); } - vtkNew erodeFilter; - erodeFilter->SetInputData(image); - erodeFilter->SetKernelSize(10, 10, 1); - erodeFilter->Update(); - vtkNew originalMapper; originalMapper->SetInputData(image); - originalMapper->Update(); vtkNew originalActor; originalActor->SetMapper(originalMapper); + vtkNew erodeFilter; + erodeFilter->SetInputData(image); + erodeFilter->SetKernelSize(10, 10, 1); + vtkNew erodedMapper; erodedMapper->SetInputConnection(erodeFilter->GetOutputPort()); - erodedMapper->Update(); vtkNew erodedActor; erodedActor->SetMapper(erodedMapper); diff --git a/src/PythonicAPI/Images/ImageContinuousDilate3D.py b/src/PythonicAPI/Images/ImageContinuousDilate3D.py index c064ac8cb38..ed5ab06fe5d 100755 --- a/src/PythonicAPI/Images/ImageContinuousDilate3D.py +++ b/src/PythonicAPI/Images/ImageContinuousDilate3D.py @@ -8,7 +8,7 @@ import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkCommonDataModel import vtkImageData -from vtkmodules.vtkIOImage import vtkPNGReader +from vtkmodules.vtkIOImage import vtkImageReader2Factory from vtkmodules.vtkImagingMorphological import vtkImageContinuousDilate3D from vtkmodules.vtkImagingSources import vtkImageCanvasSource2D from vtkmodules.vtkRenderingCore import ( @@ -62,19 +62,17 @@ def main(): source.update() image.ShallowCopy(source.output) else: - reader = vtkPNGReader(file_name=fp) + reader: vtkImageReader2Factory = vtkImageReader2Factory().CreateImageReader2(str(fp)) + reader.file_name = fp reader.update() image.ShallowCopy(reader.output) - dilate_filter = vtkImageContinuousDilate3D(input_data=image, kernel_size=(10, 10, 1)) - original_mapper = vtkDataSetMapper(input_data=image) - original_actor = vtkActor(mapper=original_mapper) + dilate_filter = vtkImageContinuousDilate3D(input_data=image, kernel_size=(10, 10, 1)) dilated_mapper = vtkDataSetMapper() dilate_filter >> dilated_mapper - dilated_actor = vtkActor(mapper=dilated_mapper) # Visualize diff --git a/src/PythonicAPI/Images/ImageContinuousErode3D.py b/src/PythonicAPI/Images/ImageContinuousErode3D.py index 3d914bccae0..16c0609a402 100755 --- a/src/PythonicAPI/Images/ImageContinuousErode3D.py +++ b/src/PythonicAPI/Images/ImageContinuousErode3D.py @@ -8,7 +8,7 @@ import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkCommonDataModel import vtkImageData -from vtkmodules.vtkIOImage import vtkPNGReader +from vtkmodules.vtkIOImage import vtkImageReader2Factory from vtkmodules.vtkImagingMorphological import vtkImageContinuousErode3D from vtkmodules.vtkImagingSources import vtkImageCanvasSource2D from vtkmodules.vtkRenderingCore import ( @@ -62,19 +62,17 @@ def main(): source.update() image.ShallowCopy(source.output) else: - reader = vtkPNGReader(file_name=fp) + reader: vtkImageReader2Factory = vtkImageReader2Factory().CreateImageReader2(str(fp)) + reader.file_name = fp reader.update() image.ShallowCopy(reader.output) - erode_filter = vtkImageContinuousErode3D(input_data=image, kernel_size=(10, 10, 1)) - original_mapper = vtkDataSetMapper(input_data=image) - original_actor = vtkActor(mapper=original_mapper) + erode_filter = vtkImageContinuousErode3D(input_data=image, kernel_size=(10, 10, 1)) eroded_mapper = vtkDataSetMapper() erode_filter >> eroded_mapper - eroded_actor = vtkActor(mapper=eroded_mapper) # Visualize @@ -93,7 +91,7 @@ def main(): render_window.AddRenderer(right_renderer) left_renderer.AddActor(original_actor) - right_renderer.AddActor(eroded_actor) + # right_renderer.AddActor(eroded_actor) left_renderer.ResetCamera() right_renderer.active_camera = left_renderer.active_camera -- GitLab From 30202a37147242fe73d6ad3e90eb6704fe0dde26 Mon Sep 17 00:00:00 2001 From: amaclean Date: Wed, 22 Apr 2026 08:46:04 +1000 Subject: [PATCH 2/2] Explicitly update the filters --- src/Cxx/Images/ImageContinuousDilate3D.cxx | 3 ++- src/Cxx/Images/ImageContinuousErode3D.cxx | 1 + src/PythonicAPI/Images/ImageContinuousDilate3D.py | 1 + src/PythonicAPI/Images/ImageContinuousErode3D.py | 3 ++- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Cxx/Images/ImageContinuousDilate3D.cxx b/src/Cxx/Images/ImageContinuousDilate3D.cxx index a599a3baaa8..5093e51cf8e 100644 --- a/src/Cxx/Images/ImageContinuousDilate3D.cxx +++ b/src/Cxx/Images/ImageContinuousDilate3D.cxx @@ -58,6 +58,7 @@ int main(int argc, char* argv[]) vtkNew dilateFilter; dilateFilter->SetInputData(image); + dilateFilter->Update(); vtkNew dilatedMapper; dilatedMapper->SetInputConnection(dilateFilter->GetOutputPort()); @@ -88,7 +89,7 @@ int main(int argc, char* argv[]) rightRenderer->SetBackground(colors->GetColor3d("RoyalBlue").GetData()); leftRenderer->AddActor(originalActor); - // rightRenderer->AddActor(dilatedActor); + rightRenderer->AddActor(dilatedActor); leftRenderer->ResetCamera(); rightRenderer->SetActiveCamera(leftRenderer->GetActiveCamera()); diff --git a/src/Cxx/Images/ImageContinuousErode3D.cxx b/src/Cxx/Images/ImageContinuousErode3D.cxx index 34c27e2a5ae..d02bbb777ba 100644 --- a/src/Cxx/Images/ImageContinuousErode3D.cxx +++ b/src/Cxx/Images/ImageContinuousErode3D.cxx @@ -59,6 +59,7 @@ int main(int argc, char* argv[]) vtkNew erodeFilter; erodeFilter->SetInputData(image); erodeFilter->SetKernelSize(10, 10, 1); + erodeFilter->Update(); vtkNew erodedMapper; erodedMapper->SetInputConnection(erodeFilter->GetOutputPort()); diff --git a/src/PythonicAPI/Images/ImageContinuousDilate3D.py b/src/PythonicAPI/Images/ImageContinuousDilate3D.py index ed5ab06fe5d..372401009ae 100755 --- a/src/PythonicAPI/Images/ImageContinuousDilate3D.py +++ b/src/PythonicAPI/Images/ImageContinuousDilate3D.py @@ -71,6 +71,7 @@ def main(): original_actor = vtkActor(mapper=original_mapper) dilate_filter = vtkImageContinuousDilate3D(input_data=image, kernel_size=(10, 10, 1)) + dilate_filter.update() dilated_mapper = vtkDataSetMapper() dilate_filter >> dilated_mapper dilated_actor = vtkActor(mapper=dilated_mapper) diff --git a/src/PythonicAPI/Images/ImageContinuousErode3D.py b/src/PythonicAPI/Images/ImageContinuousErode3D.py index 16c0609a402..56f92c5c002 100755 --- a/src/PythonicAPI/Images/ImageContinuousErode3D.py +++ b/src/PythonicAPI/Images/ImageContinuousErode3D.py @@ -71,6 +71,7 @@ def main(): original_actor = vtkActor(mapper=original_mapper) erode_filter = vtkImageContinuousErode3D(input_data=image, kernel_size=(10, 10, 1)) + erode_filter.update() eroded_mapper = vtkDataSetMapper() erode_filter >> eroded_mapper eroded_actor = vtkActor(mapper=eroded_mapper) @@ -91,7 +92,7 @@ def main(): render_window.AddRenderer(right_renderer) left_renderer.AddActor(original_actor) - # right_renderer.AddActor(eroded_actor) + right_renderer.AddActor(eroded_actor) left_renderer.ResetCamera() right_renderer.active_camera = left_renderer.active_camera -- GitLab