Commit d0bd344a authored by ozantonkal's avatar ozantonkal

image 3d widget use texture instead of imageactor for more flexibility (such as resizing)

parent 27f5cd2a
...@@ -158,7 +158,7 @@ namespace cv ...@@ -158,7 +158,7 @@ namespace cv
class CV_EXPORTS Image3DWidget : public Widget3D class CV_EXPORTS Image3DWidget : public Widget3D
{ {
public: public:
Image3DWidget(const Mat &image); Image3DWidget(const Mat &image, const Size &size);
void setImage(const Mat &image); void setImage(const Mat &image);
......
...@@ -135,6 +135,7 @@ ...@@ -135,6 +135,7 @@
#include <vtkImageData.h> #include <vtkImageData.h>
#include <vtkExtractEdges.h> #include <vtkExtractEdges.h>
#include <vtkFrustumSource.h> #include <vtkFrustumSource.h>
#include <vtkTextureMapToPlane.h>
#include <vtkPolyDataNormals.h> #include <vtkPolyDataNormals.h>
#include <vtkMapper.h> #include <vtkMapper.h>
......
...@@ -752,7 +752,7 @@ struct cv::viz::Image3DWidget::CopyImpl ...@@ -752,7 +752,7 @@ struct cv::viz::Image3DWidget::CopyImpl
} }
}; };
cv::viz::Image3DWidget::Image3DWidget(const Mat &image) cv::viz::Image3DWidget::Image3DWidget(const Mat &image, const Size &size)
{ {
CV_Assert(!image.empty() && image.depth() == CV_8U); CV_Assert(!image.empty() && image.depth() == CV_8U);
...@@ -771,9 +771,37 @@ cv::viz::Image3DWidget::Image3DWidget(const Mat &image) ...@@ -771,9 +771,37 @@ cv::viz::Image3DWidget::Image3DWidget(const Mat &image)
flipFilter->SetInputConnection(vtk_image->GetProducerPort()); flipFilter->SetInputConnection(vtk_image->GetProducerPort());
flipFilter->Update(); flipFilter->Update();
vtkSmartPointer<vtkImageActor> actor = vtkSmartPointer<vtkImageActor>::New(); Vec3d plane_center(size.width * 0.5, size.height * 0.5, 0.0);
actor->SetInput(flipFilter->GetOutput());
vtkSmartPointer<vtkPlaneSource> plane = vtkSmartPointer<vtkPlaneSource>::New();
plane->SetCenter(plane_center[0], plane_center[1], plane_center[2]);
plane->SetNormal(0.0, 0.0, 1.0);
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
transform->PreMultiply();
transform->Translate(plane_center[0], plane_center[1], plane_center[2]);
transform->Scale(size.width, size.height, 1.0);
transform->Translate(-plane_center[0], -plane_center[1], -plane_center[2]);
vtkSmartPointer<vtkTransformPolyDataFilter> transform_filter = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
transform_filter->SetTransform(transform);
transform_filter->SetInputConnection(plane->GetOutputPort());
transform_filter->Update();
// Apply the texture
vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New();
texture->SetInputConnection(flipFilter->GetOutputPort());
vtkSmartPointer<vtkTextureMapToPlane> texturePlane = vtkSmartPointer<vtkTextureMapToPlane>::New();
texturePlane->SetInputConnection(transform_filter->GetOutputPort());
vtkSmartPointer<vtkPolyDataMapper> planeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
planeMapper->SetInputConnection(texturePlane->GetOutputPort());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(planeMapper);
actor->SetTexture(texture);
WidgetAccessor::setProp(*this, actor); WidgetAccessor::setProp(*this, actor);
} }
...@@ -781,7 +809,7 @@ void cv::viz::Image3DWidget::setImage(const Mat &image) ...@@ -781,7 +809,7 @@ void cv::viz::Image3DWidget::setImage(const Mat &image)
{ {
CV_Assert(!image.empty() && image.depth() == CV_8U); CV_Assert(!image.empty() && image.depth() == CV_8U);
vtkImageActor *actor = vtkImageActor::SafeDownCast(WidgetAccessor::getProp(*this)); vtkActor *actor = vtkActor::SafeDownCast(WidgetAccessor::getProp(*this));
CV_Assert(actor); CV_Assert(actor);
// Create the vtk image and set its parameters based on input image // Create the vtk image and set its parameters based on input image
...@@ -799,7 +827,11 @@ void cv::viz::Image3DWidget::setImage(const Mat &image) ...@@ -799,7 +827,11 @@ void cv::viz::Image3DWidget::setImage(const Mat &image)
flipFilter->SetInputConnection(vtk_image->GetProducerPort()); flipFilter->SetInputConnection(vtk_image->GetProducerPort());
flipFilter->Update(); flipFilter->Update();
actor->SetInput(flipFilter->GetOutput()); // Apply the texture
vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New();
texture->SetInputConnection(flipFilter->GetOutputPort());
actor->SetTexture(texture);
} }
template<> cv::viz::Image3DWidget cv::viz::Widget::cast<cv::viz::Image3DWidget>() template<> cv::viz::Image3DWidget cv::viz::Widget::cast<cv::viz::Image3DWidget>()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment