From d3ac1bc314136d0654fad24a9ee5b01c29e9f5af Mon Sep 17 00:00:00 2001
From: Pierre-Emmanuel Viel
Date: Fri, 20 Dec 2013 01:00:55 +0100
Subject: [PATCH 01/30] When a cluster is empty for KMeans, it's better to give
it the point from another cluster j that is the furthest one from center j.
---
modules/flann/include/opencv2/flann/kmeans_index.h | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/modules/flann/include/opencv2/flann/kmeans_index.h b/modules/flann/include/opencv2/flann/kmeans_index.h
index 3fea956a74..489ed80565 100644
--- a/modules/flann/include/opencv2/flann/kmeans_index.h
+++ b/modules/flann/include/opencv2/flann/kmeans_index.h
@@ -759,10 +759,13 @@ private:
for (int k=0; k
Date: Sun, 2 Feb 2014 19:00:54 +0400
Subject: [PATCH 02/30] Updated cloud io functionality - removed dependency
from VTK legacy
---
modules/viz/src/precomp.hpp | 4 +-
modules/viz/src/vizcore.cpp | 4 +-
modules/viz/src/vtk/vtkCloudMatSink.cpp | 16 ++++
modules/viz/src/vtk/vtkCloudMatSink.h | 12 ++-
modules/viz/src/vtk/vtkOBJWriter.cpp | 37 +++++++-
modules/viz/src/vtk/vtkOBJWriter.h | 22 +++--
modules/viz/src/vtk/vtkXYZReader.cpp | 107 ++++++++++++++++++++++++
modules/viz/src/vtk/vtkXYZReader.h | 80 ++++++++++++++++++
modules/viz/src/vtk/vtkXYZWriter.cpp | 37 +++++++-
modules/viz/src/vtk/vtkXYZWriter.h | 18 +++-
10 files changed, 313 insertions(+), 24 deletions(-)
create mode 100644 modules/viz/src/vtk/vtkXYZReader.cpp
create mode 100644 modules/viz/src/vtk/vtkXYZReader.h
diff --git a/modules/viz/src/precomp.hpp b/modules/viz/src/precomp.hpp
index d9681ce83b..2b34f56389 100644
--- a/modules/viz/src/precomp.hpp
+++ b/modules/viz/src/precomp.hpp
@@ -76,7 +76,6 @@
#include
#include
#include
-#include
#include
#include
#include
@@ -115,11 +114,9 @@
#include
#include
#include
-#include
#include
#include
#include
-#include
#include
#include
#include
@@ -142,6 +139,7 @@
#include
#include
+#include
#include
#include
#include
diff --git a/modules/viz/src/vizcore.cpp b/modules/viz/src/vizcore.cpp
index b4ec83bd44..b8cad1ca68 100644
--- a/modules/viz/src/vizcore.cpp
+++ b/modules/viz/src/vizcore.cpp
@@ -173,8 +173,8 @@ cv::Mat cv::viz::readCloud(const String& file, OutputArray colors, OutputArray n
vtkSmartPointer reader;
if (extention == ".xyz")
{
- reader = vtkSmartPointer::New();
- vtkSimplePointsReader::SafeDownCast(reader)->SetFileName(file.c_str());
+ reader = vtkSmartPointer::New();
+ vtkXYZReader::SafeDownCast(reader)->SetFileName(file.c_str());
}
else if (extention == ".ply")
{
diff --git a/modules/viz/src/vtk/vtkCloudMatSink.cpp b/modules/viz/src/vtk/vtkCloudMatSink.cpp
index 09ef0cca99..7f47022c34 100644
--- a/modules/viz/src/vtk/vtkCloudMatSink.cpp
+++ b/modules/viz/src/vtk/vtkCloudMatSink.cpp
@@ -156,3 +156,19 @@ void cv::viz::vtkCloudMatSink::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "Colors: " << colors.needed() << "\n";
os << indent << "Normals: " << normals.needed() << "\n";
}
+
+int cv::viz::vtkCloudMatSink::FillInputPortInformation(int, vtkInformation *info)
+{
+ info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkPolyData");
+ return 1;
+}
+
+vtkPolyData* cv::viz::vtkCloudMatSink::GetInput()
+{
+ return vtkPolyData::SafeDownCast(this->Superclass::GetInput());
+}
+
+vtkPolyData* cv::viz::vtkCloudMatSink::GetInput(int port)
+{
+ return vtkPolyData::SafeDownCast(this->Superclass::GetInput(port));
+}
diff --git a/modules/viz/src/vtk/vtkCloudMatSink.h b/modules/viz/src/vtk/vtkCloudMatSink.h
index 44d7e52a5a..b3fd3eb719 100644
--- a/modules/viz/src/vtk/vtkCloudMatSink.h
+++ b/modules/viz/src/vtk/vtkCloudMatSink.h
@@ -46,26 +46,32 @@
#define __vtkCloudMatSink_h
#include
-#include
+#include
namespace cv
{
namespace viz
{
- class vtkCloudMatSink : public vtkPolyDataWriter
+ class vtkCloudMatSink : public vtkWriter
{
public:
static vtkCloudMatSink *New();
- vtkTypeMacro(vtkCloudMatSink,vtkPolyDataWriter)
+ vtkTypeMacro(vtkCloudMatSink,vtkWriter)
void PrintSelf(ostream& os, vtkIndent indent);
void SetOutput(OutputArray cloud, OutputArray colors = noArray(), OutputArray normals = noArray(), OutputArray tcoords = noArray());
+ // Description:
+ // Get the input to this writer.
+ vtkPolyData* GetInput();
+ vtkPolyData* GetInput(int port);
+
protected:
vtkCloudMatSink();
~vtkCloudMatSink();
void WriteData();
+ int FillInputPortInformation(int port, vtkInformation *info);
_OutputArray cloud, colors, normals, tcoords;
diff --git a/modules/viz/src/vtk/vtkOBJWriter.cpp b/modules/viz/src/vtk/vtkOBJWriter.cpp
index 452ad19a7a..e92424c665 100644
--- a/modules/viz/src/vtk/vtkOBJWriter.cpp
+++ b/modules/viz/src/vtk/vtkOBJWriter.cpp
@@ -54,7 +54,6 @@ cv::viz::vtkOBJWriter::vtkOBJWriter()
std::ofstream fout; // only used to extract the default precision
this->DecimalPrecision = fout.precision();
this->FileName = NULL;
- this->FileType = VTK_ASCII;
}
cv::viz::vtkOBJWriter::~vtkOBJWriter(){}
@@ -65,9 +64,22 @@ void cv::viz::vtkOBJWriter::WriteData()
if (!input)
return;
- std::ostream *outfilep = this->OpenVTKFile();
- if (!outfilep)
+ if (!this->FileName )
+ {
+ vtkErrorMacro(<< "No FileName specified! Can't write!");
+ this->SetErrorCode(vtkErrorCode::NoFileNameError);
return;
+ }
+
+ vtkDebugMacro(<<"Opening vtk file for writing...");
+ ostream *outfilep = new ofstream(this->FileName, ios::out);
+ if (outfilep->fail())
+ {
+ vtkErrorMacro(<< "Unable to open file: "<< this->FileName);
+ this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
+ delete outfilep;
+ return;
+ }
std::ostream& outfile = *outfilep;
@@ -224,7 +236,8 @@ void cv::viz::vtkOBJWriter::WriteData()
}
} /* if (input->GetNumberOfStrips() > 0) */
- this->CloseVTKFile(outfilep);
+ vtkDebugMacro(<<"Closing vtk file\n");
+ delete outfilep;
// Delete the file if an error occurred
if (this->ErrorCode == vtkErrorCode::OutOfDiskSpaceError)
@@ -239,3 +252,19 @@ void cv::viz::vtkOBJWriter::PrintSelf(ostream& os, vtkIndent indent)
Superclass::PrintSelf(os, indent);
os << indent << "DecimalPrecision: " << DecimalPrecision << "\n";
}
+
+int cv::viz::vtkOBJWriter::FillInputPortInformation(int, vtkInformation *info)
+{
+ info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkPolyData");
+ return 1;
+}
+
+vtkPolyData* cv::viz::vtkOBJWriter::GetInput()
+{
+ return vtkPolyData::SafeDownCast(this->Superclass::GetInput());
+}
+
+vtkPolyData* cv::viz::vtkOBJWriter::GetInput(int port)
+{
+ return vtkPolyData::SafeDownCast(this->Superclass::GetInput(port));
+}
diff --git a/modules/viz/src/vtk/vtkOBJWriter.h b/modules/viz/src/vtk/vtkOBJWriter.h
index f8889884d7..7ad0f17b15 100644
--- a/modules/viz/src/vtk/vtkOBJWriter.h
+++ b/modules/viz/src/vtk/vtkOBJWriter.h
@@ -45,29 +45,41 @@
#ifndef __vtkOBJWriter_h
#define __vtkOBJWriter_h
-#include
+#include
namespace cv
{
namespace viz
{
- class vtkOBJWriter : public vtkPolyDataWriter
+ class vtkOBJWriter : public vtkWriter
{
public:
static vtkOBJWriter *New();
- vtkTypeMacro(vtkOBJWriter,vtkPolyDataWriter)
+ vtkTypeMacro(vtkOBJWriter,vtkWriter)
void PrintSelf(ostream& os, vtkIndent indent);
- vtkGetMacro(DecimalPrecision, int);
- vtkSetMacro(DecimalPrecision, int);
+ vtkGetMacro(DecimalPrecision, int)
+ vtkSetMacro(DecimalPrecision, int)
+
+ // Description:
+ // Specify file name of data file to write.
+ vtkSetStringMacro(FileName)
+ vtkGetStringMacro(FileName)
+
+ // Description:
+ // Get the input to this writer.
+ vtkPolyData* GetInput();
+ vtkPolyData* GetInput(int port);
protected:
vtkOBJWriter();
~vtkOBJWriter();
void WriteData();
+ int FillInputPortInformation(int port, vtkInformation *info);
int DecimalPrecision;
+ char *FileName;
private:
vtkOBJWriter(const vtkOBJWriter&); // Not implemented.
diff --git a/modules/viz/src/vtk/vtkXYZReader.cpp b/modules/viz/src/vtk/vtkXYZReader.cpp
new file mode 100644
index 0000000000..283a592489
--- /dev/null
+++ b/modules/viz/src/vtk/vtkXYZReader.cpp
@@ -0,0 +1,107 @@
+/*M///////////////////////////////////////////////////////////////////////////////////////
+//
+// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
+//
+// By downloading, copying, installing or using the software you agree to this license.
+// If you do not agree to this license, do not download, install,
+// copy or use the software.
+//
+//
+// License Agreement
+// For Open Source Computer Vision Library
+//
+// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
+// Third party copyrights are property of their respective owners.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// * Redistribution's of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// * Redistribution's in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// * The name of the copyright holders may not be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// This software is provided by the copyright holders and contributors "as is" and
+// any express or implied warranties, including, but not limited to, the implied
+// warranties of merchantability and fitness for a particular purpose are disclaimed.
+// In no event shall the Intel Corporation or contributors be liable for any direct,
+// indirect, incidental, special, exemplary, or consequential damages
+// (including, but not limited to, procurement of substitute goods or services;
+// loss of use, data, or profits; or business interruption) however caused
+// and on any theory of liability, whether in contract, strict liability,
+// or tort (including negligence or otherwise) arising in any way out of
+// the use of this software, even if advised of the possibility of such damage.
+//
+// Authors:
+// * Anatoly Baksheev, Itseez Inc. myname.mysurname <> mycompany.com
+//
+//M*/
+
+#include "precomp.hpp"
+
+namespace cv { namespace viz
+{
+ vtkStandardNewMacro(vtkXYZReader);
+}}
+
+
+cv::viz::vtkXYZReader::vtkXYZReader()
+{
+ this->FileName = 0;
+ this->SetNumberOfInputPorts(0);
+}
+
+cv::viz::vtkXYZReader::~vtkXYZReader()
+{
+ this->SetFileName(0);
+}
+
+void cv::viz::vtkXYZReader::PrintSelf(ostream& os, vtkIndent indent)
+{
+ this->Superclass::PrintSelf(os,indent);
+ os << indent << "FileName: " << (this->FileName ? this->FileName : "(none)") << "\n";
+}
+
+int cv::viz::vtkXYZReader::RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector* outputVector)
+{
+ // Make sure we have a file to read.
+ if(!this->FileName)
+ {
+ vtkErrorMacro("A FileName must be specified.");
+ return 0;
+ }
+
+ // Open the input file.
+ ifstream fin(this->FileName);
+ if(!fin)
+ {
+ vtkErrorMacro("Error opening file " << this->FileName);
+ return 0;
+ }
+
+ // Allocate objects to hold points and vertex cells.
+ vtkSmartPointer points = vtkSmartPointer::New();
+ vtkSmartPointer verts = vtkSmartPointer::New();
+
+ // Read points from the file.
+ vtkDebugMacro("Reading points from file " << this->FileName);
+ double x[3];
+ while(fin >> x[0] >> x[1] >> x[2])
+ {
+ vtkIdType id = points->InsertNextPoint(x);
+ verts->InsertNextCell(1, &id);
+ }
+ vtkDebugMacro("Read " << points->GetNumberOfPoints() << " points.");
+
+ // Store the points and cells in the output data object.
+ vtkPolyData* output = vtkPolyData::GetData(outputVector);
+ output->SetPoints(points);
+ output->SetVerts(verts);
+
+ return 1;
+}
diff --git a/modules/viz/src/vtk/vtkXYZReader.h b/modules/viz/src/vtk/vtkXYZReader.h
new file mode 100644
index 0000000000..13ae048ec6
--- /dev/null
+++ b/modules/viz/src/vtk/vtkXYZReader.h
@@ -0,0 +1,80 @@
+/*M///////////////////////////////////////////////////////////////////////////////////////
+//
+// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
+//
+// By downloading, copying, installing or using the software you agree to this license.
+// If you do not agree to this license, do not download, install,
+// copy or use the software.
+//
+//
+// License Agreement
+// For Open Source Computer Vision Library
+//
+// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
+// Third party copyrights are property of their respective owners.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// * Redistribution's of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// * Redistribution's in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// * The name of the copyright holders may not be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// This software is provided by the copyright holders and contributors "as is" and
+// any express or implied warranties, including, but not limited to, the implied
+// warranties of merchantability and fitness for a particular purpose are disclaimed.
+// In no event shall the Intel Corporation or contributors be liable for any direct,
+// indirect, incidental, special, exemplary, or consequential damages
+// (including, but not limited to, procurement of substitute goods or services;
+// loss of use, data, or profits; or business interruption) however caused
+// and on any theory of liability, whether in contract, strict liability,
+// or tort (including negligence or otherwise) arising in any way out of
+// the use of this software, even if advised of the possibility of such damage.
+//
+// Authors:
+// * Anatoly Baksheev, Itseez Inc. myname.mysurname <> mycompany.com
+//
+//M*/
+
+#ifndef __vtkXYZReader_h
+#define __vtkXYZReader_h
+
+#include "vtkPolyDataAlgorithm.h"
+
+namespace cv
+{
+ namespace viz
+ {
+ class vtkXYZReader : public vtkPolyDataAlgorithm
+ {
+ public:
+ static vtkXYZReader* New();
+ vtkTypeMacro(vtkXYZReader,vtkPolyDataAlgorithm)
+ void PrintSelf(ostream& os, vtkIndent indent);
+
+ // Description:
+ // Set/Get the name of the file from which to read points.
+ vtkSetStringMacro(FileName)
+ vtkGetStringMacro(FileName)
+
+ protected:
+ vtkXYZReader();
+ ~vtkXYZReader();
+
+ char* FileName;
+
+ int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*);
+ private:
+ vtkXYZReader(const vtkXYZReader&); // Not implemented.
+ void operator=(const vtkXYZReader&); // Not implemented.
+ };
+ }
+}
+
+#endif
diff --git a/modules/viz/src/vtk/vtkXYZWriter.cpp b/modules/viz/src/vtk/vtkXYZWriter.cpp
index 4518a0103a..5a3d7d5c83 100644
--- a/modules/viz/src/vtk/vtkXYZWriter.cpp
+++ b/modules/viz/src/vtk/vtkXYZWriter.cpp
@@ -61,10 +61,22 @@ void cv::viz::vtkXYZWriter::WriteData()
if (!input)
return;
- // OpenVTKFile() will report any errors that happen
- ostream *outfilep = this->OpenVTKFile();
- if (!outfilep)
+ if (!this->FileName )
+ {
+ vtkErrorMacro(<< "No FileName specified! Can't write!");
+ this->SetErrorCode(vtkErrorCode::NoFileNameError);
return;
+ }
+
+ vtkDebugMacro(<<"Opening vtk file for writing...");
+ ostream *outfilep = new ofstream(this->FileName, ios::out);
+ if (outfilep->fail())
+ {
+ vtkErrorMacro(<< "Unable to open file: "<< this->FileName);
+ this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
+ delete outfilep;
+ return;
+ }
ostream &outfile = *outfilep;
@@ -76,7 +88,8 @@ void cv::viz::vtkXYZWriter::WriteData()
}
// Close the file
- this->CloseVTKFile(outfilep);
+ vtkDebugMacro(<<"Closing vtk file\n");
+ delete outfilep;
// Delete the file if an error occurred
if (this->ErrorCode == vtkErrorCode::OutOfDiskSpaceError)
@@ -86,8 +99,24 @@ void cv::viz::vtkXYZWriter::WriteData()
}
}
+int cv::viz::vtkXYZWriter::FillInputPortInformation(int, vtkInformation *info)
+{
+ info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkPolyData");
+ return 1;
+}
+
void cv::viz::vtkXYZWriter::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os,indent);
os << indent << "DecimalPrecision: " << this->DecimalPrecision << "\n";
}
+
+vtkPolyData* cv::viz::vtkXYZWriter::GetInput()
+{
+ return vtkPolyData::SafeDownCast(this->Superclass::GetInput());
+}
+
+vtkPolyData* cv::viz::vtkXYZWriter::GetInput(int port)
+{
+ return vtkPolyData::SafeDownCast(this->Superclass::GetInput(port));
+}
diff --git a/modules/viz/src/vtk/vtkXYZWriter.h b/modules/viz/src/vtk/vtkXYZWriter.h
index 3db18b793b..91d0c8f6b4 100644
--- a/modules/viz/src/vtk/vtkXYZWriter.h
+++ b/modules/viz/src/vtk/vtkXYZWriter.h
@@ -45,29 +45,41 @@
#ifndef __vtkXYZWriter_h
#define __vtkXYZWriter_h
-#include "vtkPolyDataWriter.h"
+#include "vtkWriter.h"
namespace cv
{
namespace viz
{
- class vtkXYZWriter : public vtkPolyDataWriter
+ class vtkXYZWriter : public vtkWriter
{
public:
static vtkXYZWriter *New();
- vtkTypeMacro(vtkXYZWriter,vtkPolyDataWriter)
+ vtkTypeMacro(vtkXYZWriter,vtkWriter)
void PrintSelf(ostream& os, vtkIndent indent);
vtkGetMacro(DecimalPrecision, int)
vtkSetMacro(DecimalPrecision, int)
+ // Description:
+ // Specify file name of data file to write.
+ vtkSetStringMacro(FileName)
+ vtkGetStringMacro(FileName)
+
+ // Description:
+ // Get the input to this writer.
+ vtkPolyData* GetInput();
+ vtkPolyData* GetInput(int port);
+
protected:
vtkXYZWriter();
~vtkXYZWriter(){}
void WriteData();
+ int FillInputPortInformation(int port, vtkInformation *info);
int DecimalPrecision;
+ char *FileName;
private:
vtkXYZWriter(const vtkXYZWriter&); // Not implemented.
From 975a6299fa1b1fee9454567280fbe251347512dd Mon Sep 17 00:00:00 2001
From: Anatoly Baksheev
Date: Sun, 2 Feb 2014 18:56:55 +0400
Subject: [PATCH 03/30] More proper OpneCv+Qt+Vtk issues handling
(http://code.opencv.org/issues/3492)
---
cmake/OpenCVDetectVTK.cmake | 55 +++++++++++++++++++++++++++----------
1 file changed, 41 insertions(+), 14 deletions(-)
diff --git a/cmake/OpenCVDetectVTK.cmake b/cmake/OpenCVDetectVTK.cmake
index 78d1a73b69..2b55a9c3f1 100644
--- a/cmake/OpenCVDetectVTK.cmake
+++ b/cmake/OpenCVDetectVTK.cmake
@@ -2,25 +2,52 @@ if(NOT WITH_VTK OR ANDROID OR IOS)
return()
endif()
-if (HAVE_QT5)
- message(STATUS "VTK is disabled because OpenCV is linked with Q5. Some VTK disributives are compiled with Q4 and therefore can't be linked together Qt5.")
+# VTK 6.x components
+find_package(VTK QUIET COMPONENTS vtkRenderingOpenGL vtkInteractionStyle vtkRenderingLOD vtkIOPLY vtkFiltersTexture vtkRenderingFreeType vtkIOExport NO_MODULE)
+
+# VTK 5.x components
+if(NOT VTK_FOUND)
+ find_package(VTK QUIET COMPONENTS vtkCommon NO_MODULE)
+endif()
+
+if(NOT VTK_FOUND)
+ set(HAVE_VTK OFF)
+ message(STATUS "VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file")
return()
endif()
-find_package(VTK 6.0 QUIET COMPONENTS vtkRenderingCore vtkInteractionWidgets vtkInteractionStyle vtkIOLegacy vtkIOPLY vtkRenderingFreeType vtkRenderingLOD vtkFiltersTexture vtkIOExport NO_MODULE)
-
-if(NOT DEFINED VTK_FOUND OR NOT VTK_FOUND)
- find_package(VTK 5.10 QUIET COMPONENTS vtkCommon vtkFiltering vtkRendering vtkWidgets vtkImaging NO_MODULE)
+# Don't support ealier VTKs
+if(${VTK_VERSION} VERSION_LESS "5.8.0")
+ message(STATUS "VTK support is disabled. VTK ver. 5.8.0 is minimum required, but found VTK ver. ${VTK_VERSION}")
+ return()
endif()
-if(NOT DEFINED VTK_FOUND OR NOT VTK_FOUND)
- find_package(VTK 5.8 QUIET COMPONENTS vtkCommon vtkFiltering vtkRendering vtkWidgets vtkImaging NO_MODULE)
+# Different Qt versions can't be linked together
+if(HAVE_QT5 AND ${VTK_VERSION} VERSION_LESS "6.0.0")
+ if(VTK_USE_QT)
+ message(STATUS "VTK support is disabled. Incompatible combination: OpenCV + Qt5 and VTK ver.${VTK_VERSION} + Qt4")
+ endif()
endif()
-if(VTK_FOUND)
- set(HAVE_VTK ON)
- message(STATUS "Found VTK ver. ${VTK_VERSION} (usefile: ${VTK_USE_FILE})")
-else()
- set(HAVE_VTK OFF)
- message(STATUS "VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or set $VTK_DIR enviroment variable to VTK install subdirectory with VTKConfig.cmake file (for windows)")
+# Different Qt versions can't be linked together. VTK 6.0.0 doesn't provide a way to get Qt version it was linked with
+if(HAVE_QT5 AND ${VTK_VERSION} VERSION_EQUAL "6.0.0" AND NOT DEFINED FORCE_VTK)
+ message(STATUS "VTK support is disabled. Possible incompatible combination: OpenCV+Qt5, and VTK ver.${VTK_VERSION} with Qt4")
+ message(STATUS "If it is known that VTK was compiled without Qt4, please define '-DFORCE_VTK=TRUE' flag in CMake")
+ return()
endif()
+
+# Different Qt versions can't be linked together
+if(HAVE_QT AND ${VTK_VERSION} VERSION_GREATER "6.0.0" AND NOT ${VTK_QT_VERSION} STREQUAL "")
+ if(HAVE_QT5 AND ${VTK_QT_VERSION} EQUAL "4")
+ message(STATUS "VTK support is disabled. Incompatible combination: OpenCV + Qt5 and VTK ver.${VTK_VERSION} + Qt4")
+ return()
+ endif()
+
+ if(NOT HAVE_QT5 AND ${VTK_QT_VERSION} EQUAL "5")
+ message(STATUS "VTK support is disabled. Incompatible combination: OpenCV + Qt4 and VTK ver.${VTK_VERSION} + Qt5")
+ return()
+ endif()
+endif()
+
+set(HAVE_VTK ON)
+message(STATUS "Found VTK ver. ${VTK_VERSION} (usefile: ${VTK_USE_FILE})")
From 998aefd1d10a5cce794cf4c81248796719b9b0e6 Mon Sep 17 00:00:00 2001
From: Anatoly Baksheev
Date: Sun, 2 Feb 2014 20:43:43 +0400
Subject: [PATCH 04/30] cloud collection merges data only on rendering
---
modules/viz/src/clouds.cpp | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/modules/viz/src/clouds.cpp b/modules/viz/src/clouds.cpp
index 4b84e8e9e1..b7c8bbb212 100644
--- a/modules/viz/src/clouds.cpp
+++ b/modules/viz/src/clouds.cpp
@@ -211,13 +211,16 @@ void cv::viz::WCloudCollection::addCloud(InputArray cloud, InputArray colors, co
vtkSmartPointer mapper = vtkPolyDataMapper::SafeDownCast(actor->GetMapper());
if (!mapper)
{
+ vtkSmartPointer append_filter = vtkSmartPointer::New();
+ VtkUtils::AddInputData(append_filter, polydata);
+
// This is the first cloud
mapper = vtkSmartPointer::New();
mapper->SetScalarRange(0, 255);
mapper->SetScalarModeToUsePointData();
mapper->ScalarVisibilityOn();
mapper->ImmediateModeRenderingOff();
- VtkUtils::SetInputData(mapper, polydata);
+ mapper->SetInputConnection(append_filter->GetOutputPort());
actor->SetNumberOfCloudPoints(std::max(1, polydata->GetNumberOfPoints()/10));
actor->GetProperty()->SetInterpolationToFlat();
@@ -226,15 +229,10 @@ void cv::viz::WCloudCollection::addCloud(InputArray cloud, InputArray colors, co
return;
}
- vtkPolyData *currdata = vtkPolyData::SafeDownCast(mapper->GetInput());
- CV_Assert("Cloud Widget without data" && currdata);
-
- vtkSmartPointer append_filter = vtkSmartPointer::New();
- VtkUtils::AddInputData(append_filter, currdata);
+ vtkSmartPointer producer = mapper->GetInputConnection(0, 0)->GetProducer();
+ vtkSmartPointer append_filter = vtkAppendPolyData::SafeDownCast(producer);
VtkUtils::AddInputData(append_filter, polydata);
- append_filter->Update();
-
- VtkUtils::SetInputData(mapper, append_filter->GetOutput());
+ append_filter->Modified();
actor->SetNumberOfCloudPoints(std::max(1, actor->GetNumberOfCloudPoints() + polydata->GetNumberOfPoints()/10));
}
From 17fea0dd0ad30f06d4676eb1d4e9320b4e6e9aa4 Mon Sep 17 00:00:00 2001
From: Anatoly Baksheev
Date: Sun, 2 Feb 2014 21:29:33 +0400
Subject: [PATCH 05/30] fixed size_t/int conversion warnings
---
modules/viz/src/clouds.cpp | 2 +-
modules/viz/src/precomp.hpp | 4 ++--
modules/viz/src/shapes.cpp | 12 ++++++------
modules/viz/src/vizcore.cpp | 4 ++--
modules/viz/src/vtk/vtkCloudMatSink.cpp | 10 +++++-----
modules/viz/src/vtk/vtkCloudMatSource.cpp | 4 ++--
modules/viz/src/vtk/vtkTrajectorySource.cpp | 10 +++++-----
modules/viz/test/tests_simple.cpp | 21 +++++++++++----------
8 files changed, 34 insertions(+), 33 deletions(-)
diff --git a/modules/viz/src/clouds.cpp b/modules/viz/src/clouds.cpp
index b7c8bbb212..c2c78d5523 100644
--- a/modules/viz/src/clouds.cpp
+++ b/modules/viz/src/clouds.cpp
@@ -347,7 +347,7 @@ cv::viz::WMesh::WMesh(const Mesh &mesh)
source->SetColorCloudNormalsTCoords(mesh.cloud, mesh.colors, mesh.normals, mesh.tcoords);
source->Update();
- Mat lookup_buffer(1, mesh.cloud.total(), CV_32SC1);
+ Mat lookup_buffer(1, (int)mesh.cloud.total(), CV_32SC1);
int *lookup = lookup_buffer.ptr();
for(int y = 0, index = 0; y < mesh.cloud.rows; ++y)
{
diff --git a/modules/viz/src/precomp.hpp b/modules/viz/src/precomp.hpp
index 2b34f56389..8329f52f12 100644
--- a/modules/viz/src/precomp.hpp
+++ b/modules/viz/src/precomp.hpp
@@ -267,8 +267,8 @@ namespace cv
vtkSmartPointer scalars = vtkSmartPointer::New();
scalars->SetName("Colors");
scalars->SetNumberOfComponents(3);
- scalars->SetNumberOfTuples(size);
- scalars->SetArray(color_data->val, size * 3, 0);
+ scalars->SetNumberOfTuples((vtkIdType)size);
+ scalars->SetArray(color_data->val, (vtkIdType)(size * 3), 0);
return scalars;
}
diff --git a/modules/viz/src/shapes.cpp b/modules/viz/src/shapes.cpp
index f3d24f757c..171470d812 100644
--- a/modules/viz/src/shapes.cpp
+++ b/modules/viz/src/shapes.cpp
@@ -390,21 +390,21 @@ cv::viz::WPolyLine::WPolyLine(InputArray _points, const Color &color)
vtkSmartPointer points = vtkSmartPointer::New();
points->SetDataType(_points.depth() == CV_32F ? VTK_FLOAT : VTK_DOUBLE);
- points->SetNumberOfPoints(total);
+ points->SetNumberOfPoints((vtkIdType)total);
if (_points.depth() == CV_32F)
for(size_t i = 0; i < total; ++i, fpoints += s_chs)
- points->SetPoint(i, fpoints);
+ points->SetPoint((vtkIdType)i, fpoints);
if (_points.depth() == CV_64F)
for(size_t i = 0; i < total; ++i, dpoints += s_chs)
- points->SetPoint(i, dpoints);
+ points->SetPoint((vtkIdType)i, dpoints);
vtkSmartPointer cell_array = vtkSmartPointer::New();
- cell_array->Allocate(cell_array->EstimateSize(1, total));
- cell_array->InsertNextCell(total);
+ cell_array->Allocate(cell_array->EstimateSize(1, (int)total));
+ cell_array->InsertNextCell((int)total);
for(size_t i = 0; i < total; ++i)
- cell_array->InsertCellPoint(i);
+ cell_array->InsertCellPoint((vtkIdType)i);
vtkSmartPointer scalars = VtkUtils::FillScalars(total, color);
diff --git a/modules/viz/src/vizcore.cpp b/modules/viz/src/vizcore.cpp
index b8cad1ca68..b4332a860a 100644
--- a/modules/viz/src/vizcore.cpp
+++ b/modules/viz/src/vizcore.cpp
@@ -278,11 +278,11 @@ void cv::viz::writeTrajectory(InputArray _traj, const String& files_format, int
if (traj.depth() == CV_32F)
for(size_t i = 0, index = max(0, start); i < traj.total(); ++i, ++index)
- writePose(cv::format(files_format.c_str(), index), traj.at(i), tag);
+ writePose(cv::format(files_format.c_str(), index), traj.at((int)i), tag);
if (traj.depth() == CV_64F)
for(size_t i = 0, index = max(0, start); i < traj.total(); ++i, ++index)
- writePose(cv::format(files_format.c_str(), index), traj.at(i), tag);
+ writePose(cv::format(files_format.c_str(), index), traj.at((int)i), tag);
}
CV_Assert(!"Unsupported array kind");
diff --git a/modules/viz/src/vtk/vtkCloudMatSink.cpp b/modules/viz/src/vtk/vtkCloudMatSink.cpp
index 7f47022c34..8bd1011323 100644
--- a/modules/viz/src/vtk/vtkCloudMatSink.cpp
+++ b/modules/viz/src/vtk/vtkCloudMatSink.cpp
@@ -79,11 +79,11 @@ void cv::viz::vtkCloudMatSink::WriteData()
if (cloud.depth() == CV_32F)
for(size_t i = 0; i < cloud.total(); ++i)
- *fdata++ = Vec3d(points_Data->GetPoint(i));
+ *fdata++ = Vec3d(points_Data->GetPoint((vtkIdType)i));
if (cloud.depth() == CV_64F)
for(size_t i = 0; i < cloud.total(); ++i)
- *ddata++ = Vec3d(points_Data->GetPoint(i));
+ *ddata++ = Vec3d(points_Data->GetPoint((vtkIdType)i));
}
else
cloud.release();
@@ -101,7 +101,7 @@ void cv::viz::vtkCloudMatSink::WriteData()
Mat buffer(cloud.size(), CV_64FC(channels));
Vec3d *cptr = buffer.ptr();
for(size_t i = 0; i < buffer.total(); ++i)
- *cptr++ = Vec3d(scalars_data->GetTuple(i));
+ *cptr++ = Vec3d(scalars_data->GetTuple((vtkIdType)i));
buffer.convertTo(colors, CV_8U, vtktype == VTK_FLOAT || VTK_FLOAT == VTK_DOUBLE ? 255.0 : 1.0);
}
@@ -121,7 +121,7 @@ void cv::viz::vtkCloudMatSink::WriteData()
Mat buffer(cloud.size(), CV_64FC(channels));
Vec3d *cptr = buffer.ptr();
for(size_t i = 0; i < buffer.total(); ++i)
- *cptr++ = Vec3d(normals_data->GetTuple(i));
+ *cptr++ = Vec3d(normals_data->GetTuple((vtkIdType)i));
buffer.convertTo(normals, vtktype == VTK_FLOAT ? CV_32F : CV_64F);
}
@@ -140,7 +140,7 @@ void cv::viz::vtkCloudMatSink::WriteData()
Mat buffer(cloud.size(), CV_64FC2);
Vec2d *cptr = buffer.ptr();
for(size_t i = 0; i < buffer.total(); ++i)
- *cptr++ = Vec2d(coords_data->GetTuple(i));
+ *cptr++ = Vec2d(coords_data->GetTuple((vtkIdType)i));
buffer.convertTo(tcoords, vtktype == VTK_FLOAT ? CV_32F : CV_64F);
diff --git a/modules/viz/src/vtk/vtkCloudMatSource.cpp b/modules/viz/src/vtk/vtkCloudMatSource.cpp
index 74d01bbd01..1d8ab7894c 100644
--- a/modules/viz/src/vtk/vtkCloudMatSource.cpp
+++ b/modules/viz/src/vtk/vtkCloudMatSource.cpp
@@ -185,8 +185,8 @@ int cv::viz::vtkCloudMatSource::filterNanCopy(const Mat& cloud)
CV_DbgAssert(DataType<_Tp>::depth == cloud.depth());
points = vtkSmartPointer::New();
points->SetDataType(VtkDepthTraits<_Tp>::data_type);
- points->Allocate(cloud.total());
- points->SetNumberOfPoints(cloud.total());
+ points->Allocate((vtkIdType)cloud.total());
+ points->SetNumberOfPoints((vtkIdType)cloud.total());
int s_chs = cloud.channels();
int total = 0;
diff --git a/modules/viz/src/vtk/vtkTrajectorySource.cpp b/modules/viz/src/vtk/vtkTrajectorySource.cpp
index e098a1d553..2036e09af3 100644
--- a/modules/viz/src/vtk/vtkTrajectorySource.cpp
+++ b/modules/viz/src/vtk/vtkTrajectorySource.cpp
@@ -64,19 +64,19 @@ void cv::viz::vtkTrajectorySource::SetTrajectory(InputArray _traj)
points = vtkSmartPointer::New();
points->SetDataType(VTK_DOUBLE);
- points->SetNumberOfPoints(total);
+ points->SetNumberOfPoints((vtkIdType)total);
tensors = vtkSmartPointer::New();
tensors->SetNumberOfComponents(9);
- tensors->SetNumberOfTuples(total);
+ tensors->SetNumberOfTuples((vtkIdType)total);
for(size_t i = 0; i < total; ++i, ++dpath)
{
Matx33d R = dpath->rotation().t(); // transposed because of
- tensors->SetTuple(i, R.val); // column major order
+ tensors->SetTuple((vtkIdType)i, R.val); // column major order
Vec3d p = dpath->translation();
- points->SetPoint(i, p.val);
+ points->SetPoint((vtkIdType)i, p.val);
}
}
@@ -85,7 +85,7 @@ cv::Mat cv::viz::vtkTrajectorySource::ExtractPoints(InputArray _traj)
CV_Assert(_traj.kind() == _InputArray::STD_VECTOR || _traj.kind() == _InputArray::MAT);
CV_Assert(_traj.type() == CV_32FC(16) || _traj.type() == CV_64FC(16));
- Mat points(1, _traj.total(), CV_MAKETYPE(_traj.depth(), 3));
+ Mat points(1, (int)_traj.total(), CV_MAKETYPE(_traj.depth(), 3));
const Affine3d* dpath = _traj.getMat().ptr();
const Affine3f* fpath = _traj.getMat().ptr();
diff --git a/modules/viz/test/tests_simple.cpp b/modules/viz/test/tests_simple.cpp
index f84b60a475..c595affba7 100644
--- a/modules/viz/test/tests_simple.cpp
+++ b/modules/viz/test/tests_simple.cpp
@@ -81,7 +81,7 @@ TEST(Viz, show_cloud_masked)
Mat dragon_cloud = readCloud(get_dragon_ply_file_path());
Vec3f qnan = Vec3f::all(std::numeric_limits::quiet_NaN());
- for(size_t i = 0; i < dragon_cloud.total(); ++i)
+ for(int i = 0; i < (int)dragon_cloud.total(); ++i)
if (i % 15 != 0)
dragon_cloud.at(i) = qnan;
@@ -170,7 +170,7 @@ TEST(Viz, show_textured_mesh)
tcoords.push_back(Vec2d(1.0, i/64.0));
}
- for(size_t i = 0; i < points.size()/2-1; ++i)
+ for(int i = 0; i < (int)points.size()/2-1; ++i)
{
int polys[] = {3, 2*i, 2*i+1, 2*i+2, 3, 2*i+1, 2*i+2, 2*i+3};
polygons.insert(polygons.end(), polys, polys + sizeof(polys)/sizeof(polys[0]));
@@ -194,7 +194,7 @@ TEST(Viz, show_textured_mesh)
TEST(Viz, show_polyline)
{
Mat polyline(1, 32, CV_64FC3);
- for(size_t i = 0; i < polyline.total(); ++i)
+ for(int i = 0; i < (int)polyline.total(); ++i)
polyline.at(i) = Vec3d(i/16.0, cos(i * CV_PI/6), sin(i * CV_PI/6));
Viz3d viz("show_polyline");
@@ -222,13 +222,14 @@ TEST(Viz, show_sampled_normals)
TEST(Viz, show_trajectories)
{
std::vector path = generate_test_trajectory(), sub0, sub1, sub2, sub3, sub4, sub5;
+ int size =(int)path.size();
- Mat(path).rowRange(0, path.size()/10+1).copyTo(sub0);
- Mat(path).rowRange(path.size()/10, path.size()/5+1).copyTo(sub1);
- Mat(path).rowRange(path.size()/5, 11*path.size()/12).copyTo(sub2);
- Mat(path).rowRange(11*path.size()/12, path.size()).copyTo(sub3);
- Mat(path).rowRange(3*path.size()/4, 33*path.size()/40).copyTo(sub4);
- Mat(path).rowRange(33*path.size()/40, 9*path.size()/10).copyTo(sub5);
+ Mat(path).rowRange(0, size/10+1).copyTo(sub0);
+ Mat(path).rowRange(size/10, size/5+1).copyTo(sub1);
+ Mat(path).rowRange(size/5, 11*size/12).copyTo(sub2);
+ Mat(path).rowRange(11*size/12, size).copyTo(sub3);
+ Mat(path).rowRange(3*size/4, 33*size/40).copyTo(sub4);
+ Mat(path).rowRange(33*size/40, 9*size/10).copyTo(sub5);
Matx33d K(1024.0, 0.0, 320.0, 0.0, 1024.0, 240.0, 0.0, 0.0, 1.0);
Viz3d viz("show_trajectories");
@@ -259,7 +260,7 @@ TEST(Viz, show_trajectory_reposition)
Viz3d viz("show_trajectory_reposition_to_origin");
viz.showWidget("coos", WCoordinateSystem());
- viz.showWidget("sub3", WTrajectory(Mat(path).rowRange(0, path.size()/3), WTrajectory::BOTH, 0.2, Color::brown()), path.front().inv());
+ viz.showWidget("sub3", WTrajectory(Mat(path).rowRange(0, (int)path.size()/3), WTrajectory::BOTH, 0.2, Color::brown()), path.front().inv());
viz.showWidget("text2d", WText("Trajectory resposition to origin", Point(20, 20), 20, Color::green()));
viz.spin();
}
From f8ccc115ef3f593b4b44f5efbc7c79a276e8619d Mon Sep 17 00:00:00 2001
From: Anatoly Baksheev
Date: Sun, 2 Feb 2014 22:08:18 +0400
Subject: [PATCH 06/30] proper render call order (fixes some issues with
VTK6.1)
---
modules/viz/src/interactor_style.cpp | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/modules/viz/src/interactor_style.cpp b/modules/viz/src/interactor_style.cpp
index 75003a2b66..7fa6714480 100644
--- a/modules/viz/src/interactor_style.cpp
+++ b/modules/viz/src/interactor_style.cpp
@@ -366,7 +366,6 @@ void cv::viz::InteractorStyle::OnKeyDown()
{
Interactor->GetRenderWindow()->SetSize(win_size_.val);
Interactor->GetRenderWindow()->SetPosition(win_pos_.val);
- Interactor->GetRenderWindow()->Render();
Interactor->Render();
}
// Set to max
@@ -376,7 +375,6 @@ void cv::viz::InteractorStyle::OnKeyDown()
win_size_ = win_size;
Interactor->GetRenderWindow()->SetSize(screen_size.val);
- Interactor->GetRenderWindow()->Render();
Interactor->Render();
max_win_size_ = Vec2i(Interactor->GetRenderWindow()->GetSize());
}
@@ -417,7 +415,7 @@ void cv::viz::InteractorStyle::OnKeyDown()
{
vtkSmartPointer cam = CurrentRenderer->GetActiveCamera();
cam->SetParallelProjection(!cam->GetParallelProjection());
- CurrentRenderer->Render();
+ Interactor->Render();
break;
}
@@ -468,7 +466,7 @@ void cv::viz::InteractorStyle::OnKeyDown()
CurrentRenderer->SetActiveCamera(cam);
CurrentRenderer->ResetCameraClippingRange();
- CurrentRenderer->Render();
+ Interactor->Render();
break;
}
@@ -594,7 +592,6 @@ void cv::viz::InteractorStyle::OnMouseWheelForward()
cam->Modified();
CurrentRenderer->ResetCameraClippingRange();
CurrentRenderer->Modified();
- CurrentRenderer->Render();
Interactor->Render();
}
else
@@ -624,7 +621,6 @@ void cv::viz::InteractorStyle::OnMouseWheelBackward()
cam->Modified();
CurrentRenderer->ResetCameraClippingRange();
CurrentRenderer->Modified();
- CurrentRenderer->Render();
Interactor->Render();
}
else
From 069dd8a068263f6b0cfce647d11637baaf48b745 Mon Sep 17 00:00:00 2001
From: Anatoly Baksheev
Date: Sat, 8 Feb 2014 16:11:20 +0400
Subject: [PATCH 07/30] default meshlab background
---
modules/viz/src/vizimpl.cpp | 3 +++
modules/viz/test/tests_simple.cpp | 1 +
2 files changed, 4 insertions(+)
diff --git a/modules/viz/src/vizimpl.cpp b/modules/viz/src/vizimpl.cpp
index 5fa49e2f96..cf7a251202 100644
--- a/modules/viz/src/vizimpl.cpp
+++ b/modules/viz/src/vizimpl.cpp
@@ -68,6 +68,8 @@ cv::viz::Viz3d::VizImpl::VizImpl(const String &name) : spin_once_state_(false),
timer_callback_ = vtkSmartPointer::New();
exit_callback_ = vtkSmartPointer::New();
exit_callback_->viz = this;
+
+ setBackgroundMeshLab();
}
/////////////////////////////////////////////////////////////////////////////////////////////
@@ -114,6 +116,7 @@ void cv::viz::Viz3d::VizImpl::recreateRenderWindow()
Vec2i window_size(window_->GetSize());
int fullscreen = window_->GetFullScreen();
+ window_->Finalize();
window_ = vtkSmartPointer::New();
if (window_position_[0] != std::numeric_limits::min()) //also workaround
window_->SetPosition(window_position_.val);
diff --git a/modules/viz/test/tests_simple.cpp b/modules/viz/test/tests_simple.cpp
index c595affba7..4edb324f4f 100644
--- a/modules/viz/test/tests_simple.cpp
+++ b/modules/viz/test/tests_simple.cpp
@@ -52,6 +52,7 @@ TEST(Viz, show_cloud_bluberry)
Affine3d pose = Affine3d().rotate(Vec3d(0, 0.8, 0));
Viz3d viz("show_cloud_bluberry");
+ viz.setBackgroundColor(Color::black());
viz.showWidget("coosys", WCoordinateSystem());
viz.showWidget("dragon", WCloud(dragon_cloud, Color::bluberry()), pose);
From 5dc17f5d587b866aaee676c723a2bd30e1f710e2 Mon Sep 17 00:00:00 2001
From: Anatoly Baksheev
Date: Sat, 8 Feb 2014 19:31:24 +0400
Subject: [PATCH 08/30] Fixed all OpenGL issues for Macos (via objective-C++
layer)
---
cmake/OpenCVModule.cmake | 10 +-
modules/viz/src/precomp.hpp | 2 +
modules/viz/src/vizimpl.cpp | 11 +-
modules/viz/src/vtk/vtkCocoaInteractorFix.mm | 213 +++++++++++++++++++
4 files changed, 233 insertions(+), 3 deletions(-)
create mode 100644 modules/viz/src/vtk/vtkCocoaInteractorFix.mm
diff --git a/cmake/OpenCVModule.cmake b/cmake/OpenCVModule.cmake
index 86a9d0c83c..6f727af8d9 100644
--- a/cmake/OpenCVModule.cmake
+++ b/cmake/OpenCVModule.cmake
@@ -484,6 +484,10 @@ macro(ocv_glob_module_sources)
file(GLOB_RECURSE lib_int_hdrs "src/*.hpp" "src/*.h")
file(GLOB lib_hdrs "include/opencv2/${name}/*.hpp" "include/opencv2/${name}/*.h")
file(GLOB lib_hdrs_detail "include/opencv2/${name}/detail/*.hpp" "include/opencv2/${name}/detail/*.h")
+ file(GLOB_RECURSE lib_srcs_apple "src/*.m*")
+ if (APPLE)
+ list(APPEND lib_srcs ${lib_srcs_apple})
+ endif()
file(GLOB lib_cuda_srcs "src/cuda/*.cu")
set(cuda_objs "")
@@ -745,7 +749,11 @@ function(ocv_add_accuracy_tests)
get_native_precompiled_header(${the_target} test_precomp.hpp)
- add_executable(${the_target} ${OPENCV_TEST_${the_module}_SOURCES} ${${the_target}_pch})
+ if(APPLE AND ${the_target} STREQUAL "opencv_test_viz")
+ add_executable(${the_target} MACOSX_BUNDLE ${OPENCV_TEST_${the_module}_SOURCES} ${${the_target}_pch})
+ else()
+ add_executable(${the_target} ${OPENCV_TEST_${the_module}_SOURCES} ${${the_target}_pch})
+ endif()
target_link_libraries(${the_target} ${OPENCV_MODULE_${the_module}_DEPS} ${test_deps} ${OPENCV_LINKER_LIBS})
add_dependencies(opencv_tests ${the_target})
diff --git a/modules/viz/src/precomp.hpp b/modules/viz/src/precomp.hpp
index 8329f52f12..f77da5a5b0 100644
--- a/modules/viz/src/precomp.hpp
+++ b/modules/viz/src/precomp.hpp
@@ -312,6 +312,8 @@ namespace cv
return transform_filter->GetOutput();
}
};
+
+ vtkSmartPointer vtkCocoaRenderWindowInteractorNew();
}
}
diff --git a/modules/viz/src/vizimpl.cpp b/modules/viz/src/vizimpl.cpp
index cf7a251202..3e852dd718 100644
--- a/modules/viz/src/vizimpl.cpp
+++ b/modules/viz/src/vizimpl.cpp
@@ -111,7 +111,7 @@ void cv::viz::Viz3d::VizImpl::close()
void cv::viz::Viz3d::VizImpl::recreateRenderWindow()
{
-#if !defined _MSC_VER
+#if !defined _MSC_VER && !defined __APPLE__
//recreating is workaround for Ubuntu -- a crash in x-server
Vec2i window_size(window_->GetSize());
int fullscreen = window_->GetFullScreen();
@@ -127,12 +127,15 @@ void cv::viz::Viz3d::VizImpl::recreateRenderWindow()
#endif
}
-
/////////////////////////////////////////////////////////////////////////////////////////////
void cv::viz::Viz3d::VizImpl::spin()
{
recreateRenderWindow();
+#if defined __APPLE__
+ interactor_ = vtkCocoaRenderWindowInteractorNew();
+#else
interactor_ = vtkSmartPointer::New();
+#endif
interactor_->SetRenderWindow(window_);
interactor_->SetInteractorStyle(style_);
window_->AlphaBitPlanesOff();
@@ -154,7 +157,11 @@ void cv::viz::Viz3d::VizImpl::spinOnce(int time, bool force_redraw)
{
spin_once_state_ = true;
recreateRenderWindow();
+#if defined __APPLE__
+ interactor_ = vtkCocoaRenderWindowInteractorNew();
+#else
interactor_ = vtkSmartPointer::New();
+#endif
interactor_->SetRenderWindow(window_);
interactor_->SetInteractorStyle(style_);
interactor_->AddObserver(vtkCommand::TimerEvent, timer_callback_);
diff --git a/modules/viz/src/vtk/vtkCocoaInteractorFix.mm b/modules/viz/src/vtk/vtkCocoaInteractorFix.mm
new file mode 100644
index 0000000000..0e55aebb08
--- /dev/null
+++ b/modules/viz/src/vtk/vtkCocoaInteractorFix.mm
@@ -0,0 +1,213 @@
+/*M///////////////////////////////////////////////////////////////////////////////////////
+//
+// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
+//
+// By downloading, copying, installing or using the software you agree to this license.
+// If you do not agree to this license, do not download, install,
+// copy or use the software.
+//
+//
+// License Agreement
+// For Open Source Computer Vision Library
+//
+// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
+// Third party copyrights are property of their respective owners.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// * Redistribution's of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// * Redistribution's in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// * The name of the copyright holders may not be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// This software is provided by the copyright holders and contributors "as is" and
+// any express or implied warranties, including, but not limited to, the implied
+// warranties of merchantability and fitness for a particular purpose are disclaimed.
+// In no event shall the Intel Corporation or contributors be liable for any direct,
+// indirect, incidental, special, exemplary, or consequential damages
+// (including, but not limited to, procurement of substitute goods or services;
+// loss of use, data, or profits; or business interruption) however caused
+// and on any theory of liability, whether in contract, strict liability,
+// or tort (including negligence or otherwise) arising in any way out of
+// the use of this software, even if advised of the possibility of such damage.
+//
+// Authors:
+// * Anatoly Baksheev, Itseez Inc. myname.mysurname <> mycompany.com
+//
+// OpenCV Viz module is complete rewrite of
+// PCL visualization module (www.pointclouds.org)
+//
+//M*/
+
+#import
+#include
+#include
+#include
+#include
+
+//----------------------------------------------------------------------------
+@interface vtkCocoaServerFix : NSObject
+{
+ vtkCocoaRenderWindow* renWin;
+}
+
++ (id)cocoaServerWithRenderWindow:(vtkCocoaRenderWindow*)inRenderWindow;
+
+- (void)start;
+- (void)stop;
+- (void)breakEventLoop;
+
+@end
+
+//----------------------------------------------------------------------------
+@implementation vtkCocoaServerFix
+
+//----------------------------------------------------------------------------
+- (id)initWithRenderWindow:(vtkCocoaRenderWindow *)inRenderWindow
+{
+ self = [super init];
+ if (self)
+ renWin = inRenderWindow;
+ return self;
+}
+
+//----------------------------------------------------------------------------
++ (id)cocoaServerWithRenderWindow:(vtkCocoaRenderWindow *)inRenderWindow
+{
+ vtkCocoaServerFix *server = [[[vtkCocoaServerFix alloc] initWithRenderWindow:inRenderWindow] autorelease];
+ return server;
+}
+
+//----------------------------------------------------------------------------
+- (void)start
+{
+ // Retrieve the NSWindow.
+ NSWindow *win = nil;
+ if (renWin)
+ {
+ win = reinterpret_cast (renWin->GetRootWindow ());
+
+ // We don't want to be informed of every window closing, so check for nil.
+ if (win != nil)
+ {
+ // Register for the windowWillClose notification in order to stop the run loop if the window closes.
+ NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
+ [nc addObserver:self selector:@selector(windowWillClose:) name:NSWindowWillCloseNotification object:win];
+ }
+ }
+ // Start the NSApplication's run loop
+ NSApplication* application = [NSApplication sharedApplication];
+ [application run];
+}
+
+//----------------------------------------------------------------------------
+- (void)stop
+{
+ [self breakEventLoop];
+}
+
+//----------------------------------------------------------------------------
+- (void)breakEventLoop
+{
+ NSApplication* application = [NSApplication sharedApplication];
+ [application stop:application];
+
+ NSEvent *event = [NSEvent otherEventWithType:NSApplicationDefined
+ location:NSMakePoint(0.0,0.0)
+ modifierFlags:0
+ timestamp:0
+ windowNumber:-1
+ context:nil
+ subtype:0
+ data1:0
+ data2:0];
+ [application postEvent:event atStart:YES];
+}
+
+//----------------------------------------------------------------------------
+- (void)windowWillClose:(NSNotification*)aNotification
+{
+ (void)aNotification;
+
+ NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
+ [nc removeObserver:self name:NSWindowWillCloseNotification object:nil];
+
+ if (renWin)
+ {
+ int windowCreated = renWin->GetWindowCreated ();
+ if (windowCreated)
+ {
+ [self breakEventLoop];
+
+ // The NSWindow is closing, so prevent anyone from accidently using it
+ renWin->SetRootWindow(NULL);
+ }
+ }
+}
+
+@end
+
+//----------------------------------------------------------------------------
+
+namespace cv { namespace viz
+{
+ class vtkCocoaRenderWindowInteractorFix : public vtkCocoaRenderWindowInteractor
+ {
+ public:
+ static vtkCocoaRenderWindowInteractorFix *New ();
+ vtkTypeMacro (vtkCocoaRenderWindowInteractorFix, vtkCocoaRenderWindowInteractor)
+
+ virtual void Start ();
+ virtual void TerminateApp ();
+
+ protected:
+ vtkCocoaRenderWindowInteractorFix () {}
+ ~vtkCocoaRenderWindowInteractorFix () {}
+
+ private:
+ vtkCocoaRenderWindowInteractorFix (const vtkCocoaRenderWindowInteractorFix&); // Not implemented.
+ void operator = (const vtkCocoaRenderWindowInteractorFix&); // Not implemented.
+ };
+
+ vtkStandardNewMacro (vtkCocoaRenderWindowInteractorFix)
+
+ vtkSmartPointer vtkCocoaRenderWindowInteractorNew();
+}}
+
+void cv::viz::vtkCocoaRenderWindowInteractorFix::Start ()
+{
+ vtkCocoaRenderWindow* renWin = vtkCocoaRenderWindow::SafeDownCast(this->GetRenderWindow ());
+ if (renWin != NULL)
+ {
+ vtkCocoaServerFix *server = reinterpret_cast (this->GetCocoaServer ());
+ if (!this->GetCocoaServer ())
+ {
+ server = [vtkCocoaServerFix cocoaServerWithRenderWindow:renWin];
+ this->SetCocoaServer (reinterpret_cast (server));
+ }
+
+ [server start];
+ }
+}
+
+void cv::viz::vtkCocoaRenderWindowInteractorFix::TerminateApp ()
+{
+ vtkCocoaRenderWindow *renWin = vtkCocoaRenderWindow::SafeDownCast (this->RenderWindow);
+ if (renWin)
+ {
+ vtkCocoaServerFix *server = reinterpret_cast (this->GetCocoaServer ());
+ [server stop];
+ }
+}
+
+vtkSmartPointer cv::viz::vtkCocoaRenderWindowInteractorNew()
+{
+ return vtkSmartPointer::New();
+}
+
From f1c062c30ab9eb02ea1b1bd8d221dc85ad7b2d27 Mon Sep 17 00:00:00 2001
From: Anatoly Baksheev
Date: Mon, 10 Feb 2014 13:27:08 +0400
Subject: [PATCH 09/30] cloud collection finalize
---
modules/viz/doc/widget.rst | 8 ++++++++
modules/viz/include/opencv2/viz/widgets.hpp | 2 ++
modules/viz/src/clouds.cpp | 18 ++++++++++++++++++
modules/viz/test/tests_simple.cpp | 1 +
4 files changed, 29 insertions(+)
diff --git a/modules/viz/doc/widget.rst b/modules/viz/doc/widget.rst
index 008e0e68a5..2802edff79 100644
--- a/modules/viz/doc/widget.rst
+++ b/modules/viz/doc/widget.rst
@@ -934,6 +934,8 @@ This 3D Widget defines a collection of clouds. ::
void addCloud(InputArray cloud, InputArray colors, const Affine3d &pose = Affine3d::Identity());
//! All points in cloud have the same color
void addCloud(InputArray cloud, const Color &color = Color::white(), Affine3d &pose = Affine3d::Identity());
+ //! Repacks internal structure to sinle cloud
+ void finalize();
};
viz::WCloudCollection::WCloudCollection
@@ -964,6 +966,12 @@ Adds a cloud to the collection.
.. note:: In case there are four channels in the cloud, fourth channel is ignored.
+viz::WCloudCollection::finalize
+-------------------------------
+Finalizes cloud data by repacking to single cloud. Useful for large cloud collections to reduce memory usage
+
+.. ocv:function:: void finalize()
+
viz::WCloudNormals
------------------
.. ocv:class:: WCloudNormals
diff --git a/modules/viz/include/opencv2/viz/widgets.hpp b/modules/viz/include/opencv2/viz/widgets.hpp
index 2c49b9d0e2..6910196c3d 100644
--- a/modules/viz/include/opencv2/viz/widgets.hpp
+++ b/modules/viz/include/opencv2/viz/widgets.hpp
@@ -345,6 +345,8 @@ namespace cv
void addCloud(InputArray cloud, InputArray colors, const Affine3d &pose = Affine3d::Identity());
//! All points in cloud have the same color
void addCloud(InputArray cloud, const Color &color = Color::white(), const Affine3d &pose = Affine3d::Identity());
+ //! Repacks internal structure to sinle cloud
+ void finalize();
};
class CV_EXPORTS WCloudNormals : public Widget3D
diff --git a/modules/viz/src/clouds.cpp b/modules/viz/src/clouds.cpp
index c2c78d5523..349de2f5f2 100644
--- a/modules/viz/src/clouds.cpp
+++ b/modules/viz/src/clouds.cpp
@@ -242,6 +242,24 @@ void cv::viz::WCloudCollection::addCloud(InputArray cloud, const Color &color, c
addCloud(cloud, Mat(cloud.size(), CV_8UC3, color), pose);
}
+void cv::viz::WCloudCollection::finalize()
+{
+ vtkSmartPointer actor = vtkLODActor::SafeDownCast(WidgetAccessor::getProp(*this));
+ CV_Assert("Incompatible widget type." && actor);
+
+ vtkSmartPointer mapper = vtkPolyDataMapper::SafeDownCast(actor->GetMapper());
+ CV_Assert("Need to add at least one cloud." && mapper);
+
+ vtkSmartPointer producer = mapper->GetInputConnection(0, 0)->GetProducer();
+ vtkSmartPointer append_filter = vtkAppendPolyData::SafeDownCast(producer);
+ append_filter->Update();
+
+ vtkSmartPointer polydata = append_filter->GetOutput();
+ mapper->RemoveInputConnection(0, 0);
+ VtkUtils::SetInputData(mapper, polydata);
+ mapper->Modified();
+}
+
template<> cv::viz::WCloudCollection cv::viz::Widget::cast()
{
Widget3D widget = this->cast();
diff --git a/modules/viz/test/tests_simple.cpp b/modules/viz/test/tests_simple.cpp
index 4edb324f4f..10c1d81808 100644
--- a/modules/viz/test/tests_simple.cpp
+++ b/modules/viz/test/tests_simple.cpp
@@ -103,6 +103,7 @@ TEST(Viz, show_cloud_collection)
ccol.addCloud(cloud, Color::white(), Affine3d().translate(Vec3d(0, 0, 0)).rotate(Vec3d(CV_PI/2, 0, 0)));
ccol.addCloud(cloud, Color::blue(), Affine3d().translate(Vec3d(1, 0, 0)));
ccol.addCloud(cloud, Color::red(), Affine3d().translate(Vec3d(2, 0, 0)));
+ ccol.finalize();
Viz3d viz("show_cloud_collection");
viz.setBackgroundColor(Color::mlab());
From 261546f6f619bb5c77cad529e8114bdc16b5f508 Mon Sep 17 00:00:00 2001
From: Anatoly Baksheev
Date: Tue, 11 Feb 2014 23:27:19 +0400
Subject: [PATCH 10/30] casting Vec3b operator for viz::Color
---
modules/viz/include/opencv2/viz/types.hpp | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/modules/viz/include/opencv2/viz/types.hpp b/modules/viz/include/opencv2/viz/types.hpp
index acbece2edf..3e8e87c65e 100644
--- a/modules/viz/include/opencv2/viz/types.hpp
+++ b/modules/viz/include/opencv2/viz/types.hpp
@@ -63,6 +63,8 @@ namespace cv
Color(const Scalar& color);
+ operator Vec3b() const;
+
static Color black();
static Color blue();
static Color green();
@@ -193,6 +195,8 @@ inline cv::viz::Color::Color(double _gray) : Scalar(_gray, _gray, _gray) {}
inline cv::viz::Color::Color(double _blue, double _green, double _red) : Scalar(_blue, _green, _red) {}
inline cv::viz::Color::Color(const Scalar& color) : Scalar(color) {}
+inline cv::viz::Color::operator cv::Vec3b() const { return cv::Vec3d(val); }
+
inline cv::viz::Color cv::viz::Color::black() { return Color( 0, 0, 0); }
inline cv::viz::Color cv::viz::Color::green() { return Color( 0, 255, 0); }
inline cv::viz::Color cv::viz::Color::blue() { return Color(255, 0, 0); }
From 1a5dfe421dcbc5c2d831fff61ad7d5bc69c2c59c Mon Sep 17 00:00:00 2001
From: Anatoly Baksheev
Date: Sat, 15 Feb 2014 17:02:17 +0400
Subject: [PATCH 11/30] Added WidgetMerger, Polyline - colors support for each
point independently, simple widgets now compute color array instead of
setting global color
---
modules/viz/doc/widget.rst | 41 +++++++
modules/viz/include/opencv2/viz/widgets.hpp | 15 +++
modules/viz/src/clouds.cpp | 114 ++++++++++++++------
modules/viz/src/precomp.hpp | 5 +
modules/viz/src/shapes.cpp | 101 ++++++++---------
modules/viz/test/tests_simple.cpp | 31 +++++-
6 files changed, 222 insertions(+), 85 deletions(-)
diff --git a/modules/viz/doc/widget.rst b/modules/viz/doc/widget.rst
index 2802edff79..31546ae8e2 100644
--- a/modules/viz/doc/widget.rst
+++ b/modules/viz/doc/widget.rst
@@ -1025,3 +1025,44 @@ Constructs a WMesh.
:param polygons: Points of the mesh object.
:param colors: Point colors.
:param normals: Point normals.
+
+viz::WWidgetMerger
+---------------------
+.. ocv:class:: WWidgetMerger
+
+This class allos to merge several widgets to single one. It has quite limited functionality and can't merge widgets with different attributes. For instance,
+if widgetA has color array and widgetB has only global color defined, then result of merge won't have color at all. The class is suitable for merging large amount of similar widgets.
+
+ class CV_EXPORTS WWidgetMerger : public Widget3D
+ {
+ public:
+ WWidgetMerger();
+
+ //! Add widget to merge with optional position change
+ void addWidget(const Widget3D& widget, const Affine3d &pose = Affine3d::Identity());
+
+ //! Repacks internal structure to sinle widget
+ void finalize();
+ };
+
+
+viz::WWidgetMerger::WWidgetMerger
+---------------------------------------
+Constructs a WWidgetMerger.
+
+.. ocv:WWidgetMerger:: WWidgetMerger()
+
+viz::WWidgetMerger::addCloud
+-------------------------------
+Adds a cloud to the collection.
+
+.. ocv:function:: void addWidget(const Widget3D& widget, const Affine3d &pose = Affine3d::Identity())
+
+ :param widget: Widget to merge.
+ :param pose: Pose of the widget.
+
+viz::WWidgetMerger::finalize
+-------------------------------
+Finalizes merger data and constructs final merged widget
+
+.. ocv:function:: void finalize()
\ No newline at end of file
diff --git a/modules/viz/include/opencv2/viz/widgets.hpp b/modules/viz/include/opencv2/viz/widgets.hpp
index 6910196c3d..0c2a4f7050 100644
--- a/modules/viz/include/opencv2/viz/widgets.hpp
+++ b/modules/viz/include/opencv2/viz/widgets.hpp
@@ -201,6 +201,7 @@ namespace cv
class CV_EXPORTS WPolyLine : public Widget3D
{
public:
+ WPolyLine(InputArray points, InputArray colors);
WPolyLine(InputArray points, const Color &color = Color::white());
};
@@ -362,6 +363,19 @@ namespace cv
WMesh(InputArray cloud, InputArray polygons, InputArray colors = noArray(), InputArray normals = noArray());
};
+
+ class CV_EXPORTS WWidgetMerger : public Widget3D
+ {
+ public:
+ WWidgetMerger();
+
+ //! Add widget to merge with optional position change
+ void addWidget(const Widget3D& widget, const Affine3d &pose = Affine3d::Identity());
+
+ //! Repacks internal structure to sinle widget
+ void finalize();
+ };
+
/////////////////////////////////////////////////////////////////////////////
/// Utility exports
@@ -391,6 +405,7 @@ namespace cv
template<> CV_EXPORTS WCloudCollection Widget::cast();
template<> CV_EXPORTS WCloudNormals Widget::cast();
template<> CV_EXPORTS WMesh Widget::cast();
+ template<> CV_EXPORTS WWidgetMerger Widget::cast();
} /* namespace viz */
} /* namespace cv */
diff --git a/modules/viz/src/clouds.cpp b/modules/viz/src/clouds.cpp
index 349de2f5f2..eec02639e5 100644
--- a/modules/viz/src/clouds.cpp
+++ b/modules/viz/src/clouds.cpp
@@ -193,8 +193,21 @@ template<> cv::viz::WPaintedCloud cv::viz::Widget::cast(
cv::viz::WCloudCollection::WCloudCollection()
{
- // Just create the actor
+ vtkSmartPointer append_filter = vtkSmartPointer::New();
+
+ vtkSmartPointer mapper = vtkSmartPointer::New();
+ mapper->SetInputConnection(append_filter->GetOutputPort());
+ mapper->SetScalarModeToUsePointData();
+ mapper->ImmediateModeRenderingOff();
+ mapper->SetScalarRange(0, 255);
+ mapper->ScalarVisibilityOn();
+
vtkSmartPointer actor = vtkSmartPointer::New();
+ actor->SetNumberOfCloudPoints(1);
+ actor->GetProperty()->SetInterpolationToFlat();
+ actor->GetProperty()->BackfaceCullingOn();
+ actor->SetMapper(mapper);
+
WidgetAccessor::setProp(*this, actor);
}
@@ -206,33 +219,11 @@ void cv::viz::WCloudCollection::addCloud(InputArray cloud, InputArray colors, co
vtkSmartPointer polydata = VtkUtils::TransformPolydata(source->GetOutputPort(), pose);
vtkSmartPointer actor = vtkLODActor::SafeDownCast(WidgetAccessor::getProp(*this));
- CV_Assert("Incompatible widget type." && actor);
+ CV_Assert("Correctness check." && actor);
- vtkSmartPointer mapper = vtkPolyDataMapper::SafeDownCast(actor->GetMapper());
- if (!mapper)
- {
- vtkSmartPointer append_filter = vtkSmartPointer::New();
- VtkUtils::AddInputData(append_filter, polydata);
-
- // This is the first cloud
- mapper = vtkSmartPointer::New();
- mapper->SetScalarRange(0, 255);
- mapper->SetScalarModeToUsePointData();
- mapper->ScalarVisibilityOn();
- mapper->ImmediateModeRenderingOff();
- mapper->SetInputConnection(append_filter->GetOutputPort());
-
- actor->SetNumberOfCloudPoints(std::max(1, polydata->GetNumberOfPoints()/10));
- actor->GetProperty()->SetInterpolationToFlat();
- actor->GetProperty()->BackfaceCullingOn();
- actor->SetMapper(mapper);
- return;
- }
-
- vtkSmartPointer producer = mapper->GetInputConnection(0, 0)->GetProducer();
+ vtkSmartPointer producer = actor->GetMapper()->GetInputConnection(0, 0)->GetProducer();
vtkSmartPointer append_filter = vtkAppendPolyData::SafeDownCast(producer);
VtkUtils::AddInputData(append_filter, polydata);
- append_filter->Modified();
actor->SetNumberOfCloudPoints(std::max(1, actor->GetNumberOfCloudPoints() + polydata->GetNumberOfPoints()/10));
}
@@ -257,7 +248,6 @@ void cv::viz::WCloudCollection::finalize()
vtkSmartPointer polydata = append_filter->GetOutput();
mapper->RemoveInputConnection(0, 0);
VtkUtils::SetInputData(mapper, polydata);
- mapper->Modified();
}
template<> cv::viz::WCloudCollection cv::viz::Widget::cast()
@@ -332,20 +322,18 @@ cv::viz::WCloudNormals::WCloudNormals(InputArray _cloud, InputArray _normals, in
}
}
- vtkSmartPointer polyData = vtkSmartPointer::New();
- polyData->SetPoints(points);
- polyData->SetLines(lines);
+ vtkSmartPointer polydata = vtkSmartPointer::New();
+ polydata->SetPoints(points);
+ polydata->SetLines(lines);
+ VtkUtils::FillScalars(polydata, color);
vtkSmartPointer mapper = vtkSmartPointer::New();
- mapper->SetColorModeToMapScalars();
- mapper->SetScalarModeToUsePointData();
- VtkUtils::SetInputData(mapper, polyData);
+ VtkUtils::SetInputData(mapper, polydata);
vtkSmartPointer actor = vtkSmartPointer::New();
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
template<> cv::viz::WCloudNormals cv::viz::Widget::cast()
@@ -455,3 +443,63 @@ template<> CV_EXPORTS cv::viz::WMesh cv::viz::Widget::cast()
Widget3D widget = this->cast();
return static_cast(widget);
}
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+/// Widget Merger implementation
+
+cv::viz::WWidgetMerger::WWidgetMerger()
+{
+ vtkSmartPointer append_filter = vtkSmartPointer::New();
+
+ vtkSmartPointer mapper = vtkSmartPointer::New();
+ mapper->SetInputConnection(append_filter->GetOutputPort());
+ mapper->SetScalarModeToUsePointData();
+ mapper->ImmediateModeRenderingOff();
+ mapper->SetScalarRange(0, 255);
+ mapper->ScalarVisibilityOn();
+
+ vtkSmartPointer actor = vtkSmartPointer::New();
+ actor->GetProperty()->SetInterpolationToFlat();
+ actor->GetProperty()->BackfaceCullingOn();
+ actor->SetMapper(mapper);
+
+ WidgetAccessor::setProp(*this, actor);
+}
+
+void cv::viz::WWidgetMerger::addWidget(const Widget3D& widget, const Affine3d &pose)
+{
+ vtkActor *widget_actor = vtkActor::SafeDownCast(WidgetAccessor::getProp(widget));
+ CV_Assert("Widget is not 3D actor." && widget_actor);
+
+ vtkSmartPointer widget_mapper = vtkPolyDataMapper::SafeDownCast(widget_actor->GetMapper());
+ CV_Assert("Widget doesn't have a polydata mapper" && widget_mapper);
+ widget_mapper->Update();
+
+ vtkSmartPointer actor = vtkActor::SafeDownCast(WidgetAccessor::getProp(*this));
+ vtkSmartPointer producer = actor->GetMapper()->GetInputConnection(0, 0)->GetProducer();
+ vtkSmartPointer append_filter = vtkAppendPolyData::SafeDownCast(producer);
+ CV_Assert("Correctness check" && append_filter);
+
+ VtkUtils::AddInputData(append_filter, VtkUtils::TransformPolydata(widget_mapper->GetInput(), pose));
+}
+
+void cv::viz::WWidgetMerger::finalize()
+{
+ vtkSmartPointer actor = vtkActor::SafeDownCast(WidgetAccessor::getProp(*this));
+ vtkSmartPointer producer = actor->GetMapper()->GetInputConnection(0, 0)->GetProducer();
+ vtkSmartPointer append_filter = vtkAppendPolyData::SafeDownCast(producer);
+ CV_Assert("Correctness check" && append_filter);
+ append_filter->Update();
+
+ vtkSmartPointer mapper = vtkPolyDataMapper::SafeDownCast(actor->GetMapper());
+ mapper->RemoveInputConnection(0, 0);
+ VtkUtils::SetInputData(mapper, append_filter->GetOutput());
+ mapper->Modified();
+}
+
+template<> CV_EXPORTS cv::viz::WWidgetMerger cv::viz::Widget::cast()
+{
+ Widget3D widget = this->cast();
+ return static_cast(widget);
+}
diff --git a/modules/viz/src/precomp.hpp b/modules/viz/src/precomp.hpp
index f77da5a5b0..c594962059 100644
--- a/modules/viz/src/precomp.hpp
+++ b/modules/viz/src/precomp.hpp
@@ -272,6 +272,11 @@ namespace cv
return scalars;
}
+ static vtkSmartPointer FillScalars(vtkSmartPointer polydata, const Color& color)
+ {
+ return polydata->GetPointData()->SetScalars(FillScalars(polydata->GetNumberOfPoints(), color)), polydata;
+ }
+
static vtkSmartPointer ComputeNormals(vtkSmartPointer polydata)
{
vtkSmartPointer normals_generator = vtkSmartPointer::New();
diff --git a/modules/viz/src/shapes.cpp b/modules/viz/src/shapes.cpp
index 171470d812..4dd77038ec 100644
--- a/modules/viz/src/shapes.cpp
+++ b/modules/viz/src/shapes.cpp
@@ -54,14 +54,16 @@ cv::viz::WLine::WLine(const Point3d &pt1, const Point3d &pt2, const Color &color
line->SetPoint2(pt2.x, pt2.y, pt2.z);
line->Update();
+ vtkSmartPointer polydata = line->GetOutput();
+ VtkUtils::FillScalars(polydata, color);
+
vtkSmartPointer mapper = vtkSmartPointer::New();
- VtkUtils::SetInputData(mapper, line->GetOutput());
+ VtkUtils::SetInputData(mapper, polydata);
vtkSmartPointer actor = vtkSmartPointer::New();
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
template<> cv::viz::WLine cv::viz::Widget::cast()
@@ -83,14 +85,16 @@ cv::viz::WSphere::WSphere(const Point3d ¢er, double radius, int sphere_resol
sphere->LatLongTessellationOff();
sphere->Update();
+ vtkSmartPointer polydata = sphere->GetOutput();
+ VtkUtils::FillScalars(polydata, color);
+
vtkSmartPointer mapper = vtkSmartPointer::New();
- VtkUtils::SetInputData(mapper, sphere->GetOutput());
+ VtkUtils::SetInputData(mapper, polydata);
vtkSmartPointer actor = vtkSmartPointer::New();
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
template<> cv::viz::WSphere cv::viz::Widget::cast()
@@ -110,15 +114,17 @@ cv::viz::WPlane::WPlane(const Size2d& size, const Color &color)
plane->SetPoint2(-0.5 * size.width, 0.5 * size.height, 0.0);
plane->Update();
+ vtkSmartPointer polydata = plane->GetOutput();
+ VtkUtils::FillScalars(polydata, color);
+
vtkSmartPointer mapper = vtkSmartPointer::New();
- VtkUtils::SetInputData(mapper, plane->GetOutput());
+ VtkUtils::SetInputData(mapper, polydata);
vtkSmartPointer actor = vtkSmartPointer::New();
actor->SetMapper(mapper);
actor->GetProperty()->LightingOff();
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
cv::viz::WPlane::WPlane(const Point3d& center, const Vec3d& normal, const Vec3d& new_yaxis, const Size2d& size, const Color &color)
@@ -161,6 +167,7 @@ cv::viz::WArrow::WArrow(const Point3d& pt1, const Point3d& pt2, double thickness
Affine3d transform_with_scale(R * length, start_point);
vtkSmartPointer polydata = VtkUtils::TransformPolydata(arrow_source->GetOutputPort(), transform_with_scale);
+ VtkUtils::FillScalars(polydata, color);
vtkSmartPointer mapper = vtkSmartPointer::New();
VtkUtils::SetInputData(mapper, polydata);
@@ -169,7 +176,6 @@ cv::viz::WArrow::WArrow(const Point3d& pt1, const Point3d& pt2, double thickness
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
template<> cv::viz::WArrow cv::viz::Widget::cast()
@@ -189,16 +195,17 @@ cv::viz::WCircle::WCircle(double radius, double thickness, const Color &color)
disk->SetOuterRadius(radius + thickness);
disk->Update();
+ vtkSmartPointer polydata = disk->GetOutput();
+ VtkUtils::FillScalars(polydata, color);
+
vtkSmartPointer mapper = vtkSmartPointer::New();
- VtkUtils::SetInputData(mapper, disk->GetOutput());
+ VtkUtils::SetInputData(mapper, polydata);
vtkSmartPointer actor = vtkSmartPointer::New();
actor->GetProperty()->LightingOff();
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
-
}
cv::viz::WCircle::WCircle(double radius, const Point3d& center, const Vec3d& normal, double thickness, const Color &color)
@@ -231,14 +238,16 @@ cv::viz::WCone::WCone(double length, double radius, int resolution, const Color
cone_source->SetResolution(resolution);
cone_source->Update();
+ vtkSmartPointer polydata = cone_source->GetOutput();
+ VtkUtils::FillScalars(polydata, color);
+
vtkSmartPointer mapper = vtkSmartPointer::New();
- VtkUtils::SetInputData(mapper, cone_source->GetOutput());
+ VtkUtils::SetInputData(mapper, polydata);
vtkSmartPointer actor = vtkSmartPointer::New();
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
cv::viz::WCone::WCone(double radius, const Point3d& center, const Point3d& tip, int resolution, const Color &color)
@@ -274,14 +283,16 @@ cv::viz::WCylinder::WCylinder(const Point3d& axis_point1, const Point3d& axis_po
tuber->SetRadius(radius);
tuber->Update();
+ vtkSmartPointer polydata = tuber->GetOutput();
+ VtkUtils::FillScalars(polydata, color);
+
vtkSmartPointer mapper = vtkSmartPointer::New();
- VtkUtils::SetInputData(mapper, tuber->GetOutput());
+ VtkUtils::SetInputData(mapper, polydata);
vtkSmartPointer actor = vtkSmartPointer::New();
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
template<> cv::viz::WCylinder cv::viz::Widget::cast()
@@ -315,15 +326,16 @@ cv::viz::WCube::WCube(const Point3d& min_point, const Point3d& max_point, bool w
vtkCubeSource::SafeDownCast(cube)->SetBounds(bounds);
}
cube->Update();
+ vtkSmartPointer polydata =cube->GetOutput();
+ VtkUtils::FillScalars(polydata, color);
vtkSmartPointer mapper = vtkSmartPointer::New();
- VtkUtils::SetInputData(mapper, cube->GetOutput());
+ VtkUtils::SetInputData(mapper, polydata);
vtkSmartPointer actor = vtkSmartPointer::New();
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
template<> cv::viz::WCube cv::viz::Widget::cast()
@@ -379,40 +391,21 @@ template<> cv::viz::WCoordinateSystem cv::viz::Widget::cast cloud_source = vtkSmartPointer::New();
+ cloud_source->SetColorCloud(points, colors);
+ cloud_source->Update();
- const float *fpoints = _points.getMat().ptr();
- const double *dpoints = _points.getMat().ptr();
- size_t total = _points.total();
- int s_chs = _points.channels();
-
- vtkSmartPointer points = vtkSmartPointer::New();
- points->SetDataType(_points.depth() == CV_32F ? VTK_FLOAT : VTK_DOUBLE);
- points->SetNumberOfPoints((vtkIdType)total);
-
- if (_points.depth() == CV_32F)
- for(size_t i = 0; i < total; ++i, fpoints += s_chs)
- points->SetPoint((vtkIdType)i, fpoints);
-
- if (_points.depth() == CV_64F)
- for(size_t i = 0; i < total; ++i, dpoints += s_chs)
- points->SetPoint((vtkIdType)i, dpoints);
+ vtkSmartPointer polydata = cloud_source->GetOutput();
vtkSmartPointer cell_array = vtkSmartPointer::New();
- cell_array->Allocate(cell_array->EstimateSize(1, (int)total));
- cell_array->InsertNextCell((int)total);
- for(size_t i = 0; i < total; ++i)
- cell_array->InsertCellPoint((vtkIdType)i);
+ cell_array->Allocate(cell_array->EstimateSize(1, polydata->GetNumberOfPoints()));
+ cell_array->InsertNextCell(polydata->GetNumberOfPoints());
+ for(vtkIdType i = 0; i < polydata->GetNumberOfPoints(); ++i)
+ cell_array->InsertCellPoint(i);
- vtkSmartPointer scalars = VtkUtils::FillScalars(total, color);
-
- vtkSmartPointer polydata = vtkSmartPointer::New();
- polydata->SetPoints(points);
polydata->SetLines(cell_array);
- polydata->GetPointData()->SetScalars(scalars);
-
vtkSmartPointer mapper = vtkSmartPointer::New();
VtkUtils::SetInputData(mapper, polydata);
mapper->SetScalarRange(0, 255);
@@ -423,6 +416,12 @@ cv::viz::WPolyLine::WPolyLine(InputArray _points, const Color &color)
WidgetAccessor::setProp(*this, actor);
}
+cv::viz::WPolyLine::WPolyLine(InputArray points, const Color &color)
+{
+ WPolyLine polyline(points, Mat(points.size(), CV_8UC3, color));
+ *this = polyline;
+}
+
template<> cv::viz::WPolyLine cv::viz::Widget::cast()
{
Widget3D widget = this->cast();
@@ -450,14 +449,16 @@ cv::viz::WGrid::WGrid(const Vec2i &cells, const Vec2d &cells_spacing, const Colo
VtkUtils::SetInputData(extract_edges, grid_data);
extract_edges->Update();
+ vtkSmartPointer polydata = extract_edges->GetOutput();
+ VtkUtils::FillScalars(polydata, color);
+
vtkSmartPointer mapper = vtkSmartPointer::New();
- VtkUtils::SetInputData(mapper, extract_edges->GetOutput());
+ VtkUtils::SetInputData(mapper, polydata);
vtkSmartPointer actor = vtkSmartPointer::New();
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
cv::viz::WGrid::WGrid(const Point3d& center, const Vec3d& normal, const Vec3d& new_yaxis, const Vec2i &cells, const Vec2d &cells_spacing, const Color &color)
@@ -807,6 +808,7 @@ cv::viz::WCameraPosition::WCameraPosition(const Matx33d &K, double scale, const
double aspect_ratio = f_y / f_x;
vtkSmartPointer polydata = CameraPositionUtils::createFrustum(aspect_ratio, fovy, scale);
+ VtkUtils::FillScalars(polydata, color);
vtkSmartPointer mapper = vtkSmartPointer::New();
VtkUtils::SetInputData(mapper, polydata);
@@ -815,7 +817,6 @@ cv::viz::WCameraPosition::WCameraPosition(const Matx33d &K, double scale, const
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
cv::viz::WCameraPosition::WCameraPosition(const Vec2d &fov, double scale, const Color &color)
@@ -824,6 +825,7 @@ cv::viz::WCameraPosition::WCameraPosition(const Vec2d &fov, double scale, const
double fovy = fov[1] * 180 / CV_PI;
vtkSmartPointer polydata = CameraPositionUtils::createFrustum(aspect_ratio, fovy, scale);
+ VtkUtils::FillScalars(polydata, color);
vtkSmartPointer mapper = vtkSmartPointer::New();
VtkUtils::SetInputData(mapper, polydata);
@@ -832,7 +834,6 @@ cv::viz::WCameraPosition::WCameraPosition(const Vec2d &fov, double scale, const
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
cv::viz::WCameraPosition::WCameraPosition(const Matx33d &K, InputArray _image, double scale, const Color &color)
@@ -967,6 +968,7 @@ cv::viz::WTrajectoryFrustums::WTrajectoryFrustums(InputArray _path, const Matx33
source->SetTrajectory(_path);
vtkSmartPointer glyph = getPolyData(WCameraPosition(K, scale));
+ VtkUtils::FillScalars(glyph, color);
vtkSmartPointer tensor_glyph = vtkSmartPointer::New();
tensor_glyph->SetInputConnection(source->GetOutputPort());
@@ -984,7 +986,6 @@ cv::viz::WTrajectoryFrustums::WTrajectoryFrustums(InputArray _path, const Matx33
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
cv::viz::WTrajectoryFrustums::WTrajectoryFrustums(InputArray _path, const Vec2d &fov, double scale, const Color &color)
@@ -993,6 +994,7 @@ cv::viz::WTrajectoryFrustums::WTrajectoryFrustums(InputArray _path, const Vec2d
source->SetTrajectory(_path);
vtkSmartPointer glyph = getPolyData(WCameraPosition(fov, scale));
+ VtkUtils::FillScalars(glyph, color);
vtkSmartPointer tensor_glyph = vtkSmartPointer::New();
tensor_glyph->SetInputConnection(source->GetOutputPort());
@@ -1010,7 +1012,6 @@ cv::viz::WTrajectoryFrustums::WTrajectoryFrustums(InputArray _path, const Vec2d
actor->SetMapper(mapper);
WidgetAccessor::setProp(*this, actor);
- setColor(color);
}
template<> cv::viz::WTrajectoryFrustums cv::viz::Widget::cast()
diff --git a/modules/viz/test/tests_simple.cpp b/modules/viz/test/tests_simple.cpp
index 10c1d81808..d1b059cf67 100644
--- a/modules/viz/test/tests_simple.cpp
+++ b/modules/viz/test/tests_simple.cpp
@@ -156,6 +156,27 @@ TEST(Viz, show_mesh_random_colors)
viz.spin();
}
+TEST(Viz, show_widget_merger)
+{
+ WWidgetMerger merger;
+ merger.addWidget(WCube(Vec3d::all(0.0), Vec3d::all(1.0), true, Color::gold()));
+
+ RNG& rng = theRNG();
+ for(int i = 0; i < 77; ++i)
+ {
+ Vec3b c;
+ rng.fill(c, RNG::NORMAL, Scalar::all(128), Scalar::all(48), true);
+ merger.addWidget(WSphere(Vec3d(c)*(1.0/255.0), 7.0/255.0, 10, Color(c[2], c[1], c[0])));
+ }
+ merger.finalize();
+
+ Viz3d viz("show_mesh_random_color");
+ viz.showWidget("coo", WCoordinateSystem());
+ viz.showWidget("merger", merger);
+ viz.showWidget("text2d", WText("Widget merger", Point(20, 20), 20, Color::green()));
+ viz.spin();
+}
+
TEST(Viz, show_textured_mesh)
{
Mat lena = imread(Path::combine(cvtest::TS::ptr()->get_data_path(), "lena.png"));
@@ -195,12 +216,18 @@ TEST(Viz, show_textured_mesh)
TEST(Viz, show_polyline)
{
- Mat polyline(1, 32, CV_64FC3);
+ const Color palette[] = { Color::red(), Color::green(), Color::blue(), Color::gold(), Color::raspberry(), Color::bluberry(), Color::lime() };
+ size_t palette_size = sizeof(palette)/sizeof(palette[0]);
+
+ Mat polyline(1, 32, CV_64FC3), colors(1, 32, CV_8UC3);
for(int i = 0; i < (int)polyline.total(); ++i)
+ {
polyline.at(i) = Vec3d(i/16.0, cos(i * CV_PI/6), sin(i * CV_PI/6));
+ colors.at(i) = palette[i & palette_size];
+ }
Viz3d viz("show_polyline");
- viz.showWidget("polyline", WPolyLine(Mat(polyline), Color::apricot()));
+ viz.showWidget("polyline", WPolyLine(polyline, colors));
viz.showWidget("coosys", WCoordinateSystem());
viz.showWidget("text2d", WText("Polyline", Point(20, 20), 20, Color::green()));
viz.spin();
From 56754e907dcc40f5caa9bcae242a1d0ae5eb1932 Mon Sep 17 00:00:00 2001
From: Anatoly Baksheev
Date: Sat, 15 Feb 2014 20:08:04 +0400
Subject: [PATCH 12/30] fixed crash for windows if console widow is closed or
CTRL_C/CTRL_BRAK keys in console are pressed.
---
modules/viz/include/opencv2/viz/viz3d.hpp | 2 +
modules/viz/src/precomp.hpp | 14 +++++-
modules/viz/src/viz3d.cpp | 2 +
modules/viz/src/vizcore.cpp | 52 +++++++++++++++++++----
modules/viz/src/vizimpl.cpp | 2 +
modules/viz/src/vizimpl.hpp | 2 +-
6 files changed, 62 insertions(+), 12 deletions(-)
diff --git a/modules/viz/include/opencv2/viz/viz3d.hpp b/modules/viz/include/opencv2/viz/viz3d.hpp
index 1a137bcfb3..1be748c8cd 100644
--- a/modules/viz/include/opencv2/viz/viz3d.hpp
+++ b/modules/viz/include/opencv2/viz/viz3d.hpp
@@ -114,6 +114,8 @@ namespace cv
double getRenderingProperty(const String &id, int property);
void setRepresentation(int representation);
+
+ void setGlobalWarnings(bool enabled = false);
private:
struct VizImpl;
diff --git a/modules/viz/src/precomp.hpp b/modules/viz/src/precomp.hpp
index c594962059..795ac16b07 100644
--- a/modules/viz/src/precomp.hpp
+++ b/modules/viz/src/precomp.hpp
@@ -155,7 +155,16 @@ namespace cv
namespace viz
{
typedef std::map > WidgetActorMap;
- typedef std::map VizMap;
+
+ struct VizMap
+ {
+ typedef std::map type;
+ typedef type::iterator iterator;
+
+ type m;
+ ~VizMap();
+ void replace_clear();
+ };
class VizStorage
{
@@ -167,7 +176,6 @@ namespace cv
private:
VizStorage(); // Static
- ~VizStorage();
static void add(const Viz3d& window);
static Viz3d& get(const String &window_name);
@@ -177,6 +185,8 @@ namespace cv
static VizMap storage;
friend class Viz3d;
+
+ static VizStorage init;
};
template inline _Tp normalized(const _Tp& v) { return v * 1/norm(v); }
diff --git a/modules/viz/src/viz3d.cpp b/modules/viz/src/viz3d.cpp
index 56f978c0ea..6e7dfcae78 100644
--- a/modules/viz/src/viz3d.cpp
+++ b/modules/viz/src/viz3d.cpp
@@ -146,3 +146,5 @@ void cv::viz::Viz3d::setRenderingProperty(const String &id, int property, double
double cv::viz::Viz3d::getRenderingProperty(const String &id, int property) { return getWidget(id).getRenderingProperty(property); }
void cv::viz::Viz3d::setRepresentation(int representation) { impl_->setRepresentation(representation); }
+
+void cv::viz::Viz3d::setGlobalWarnings(bool enabled) { vtkObject::SetGlobalWarningDisplay(enabled ? 1 : 0); }
diff --git a/modules/viz/src/vizcore.cpp b/modules/viz/src/vizcore.cpp
index b4332a860a..1166c08741 100644
--- a/modules/viz/src/vizcore.cpp
+++ b/modules/viz/src/vizcore.cpp
@@ -67,36 +67,70 @@ cv::Affine3d cv::viz::makeCameraPose(const Vec3d& position, const Vec3d& focal_p
///////////////////////////////////////////////////////////////////////////////////////////////
/// VizStorage implementation
+#if defined(_WIN32) && !defined(__CYGWIN__)
+
+ #include
+
+ static BOOL WINAPI ConsoleHandlerRoutine(DWORD /*dwCtrlType*/)
+ {
+ vtkObject::GlobalWarningDisplayOff();
+ return FALSE;
+ }
+
+ static void register_console_handler()
+ {
+ HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
+ CONSOLE_SCREEN_BUFFER_INFO hOutInfo;
+ if (GetConsoleScreenBufferInfo(hOut, &hOutInfo))
+ SetConsoleCtrlHandler(ConsoleHandlerRoutine, TRUE);
+ }
+
+#else
+
+ void register_console_handler() {}
+
+#endif
+
+
+cv::viz::VizStorage cv::viz::VizStorage::init;
cv::viz::VizMap cv::viz::VizStorage::storage;
-void cv::viz::VizStorage::unregisterAll() { storage.clear(); }
+
+void cv::viz::VizMap::replace_clear() { type().swap(m); }
+cv::viz::VizMap::~VizMap() { replace_clear(); }
+
+cv::viz::VizStorage::VizStorage()
+{
+ register_console_handler();
+}
+void cv::viz::VizStorage::unregisterAll() { storage.replace_clear(); }
cv::viz::Viz3d& cv::viz::VizStorage::get(const String &window_name)
{
String name = generateWindowName(window_name);
- VizMap::iterator vm_itr = storage.find(name);
- CV_Assert(vm_itr != storage.end());
+ VizMap::iterator vm_itr = storage.m.find(name);
+ CV_Assert(vm_itr != storage.m.end());
return vm_itr->second;
}
void cv::viz::VizStorage::add(const Viz3d& window)
{
String window_name = window.getWindowName();
- VizMap::iterator vm_itr = storage.find(window_name);
- CV_Assert(vm_itr == storage.end());
- storage.insert(std::make_pair(window_name, window));
+ VizMap::iterator vm_itr = storage.m.find(window_name);
+ CV_Assert(vm_itr == storage.m.end());
+ storage.m.insert(std::make_pair(window_name, window));
}
bool cv::viz::VizStorage::windowExists(const String &window_name)
{
String name = generateWindowName(window_name);
- return storage.find(name) != storage.end();
+ return storage.m.find(name) != storage.m.end();
}
void cv::viz::VizStorage::removeUnreferenced()
{
- for(VizMap::iterator pos = storage.begin(); pos != storage.end();)
+ for(VizMap::iterator pos = storage.m.begin(); pos != storage.m.end();)
if(pos->second.impl_->ref_counter == 1)
- storage.erase(pos++);
+ storage.m.erase(pos++);
else
++pos;
}
diff --git a/modules/viz/src/vizimpl.cpp b/modules/viz/src/vizimpl.cpp
index 3e852dd718..37d008bc82 100644
--- a/modules/viz/src/vizimpl.cpp
+++ b/modules/viz/src/vizimpl.cpp
@@ -72,6 +72,8 @@ cv::viz::Viz3d::VizImpl::VizImpl(const String &name) : spin_once_state_(false),
setBackgroundMeshLab();
}
+cv::viz::Viz3d::VizImpl::~VizImpl() { close(); }
+
/////////////////////////////////////////////////////////////////////////////////////////////
void cv::viz::Viz3d::VizImpl::TimerCallback::Execute(vtkObject* caller, unsigned long event_id, void* cookie)
{
diff --git a/modules/viz/src/vizimpl.hpp b/modules/viz/src/vizimpl.hpp
index 02675e0a5c..67cab3674b 100644
--- a/modules/viz/src/vizimpl.hpp
+++ b/modules/viz/src/vizimpl.hpp
@@ -55,7 +55,7 @@ public:
int ref_counter;
VizImpl(const String &name);
- virtual ~VizImpl() {}
+ virtual ~VizImpl();
bool wasStopped() const;
void close();
From 03bd82796de2278f0fac1424a255c339d214ec10 Mon Sep 17 00:00:00 2001
From: Anatoly Baksheev