Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
130914d9
Commit
130914d9
authored
Jan 20, 2014
by
Anatoly Baksheev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed documentation warnings
parent
02ebc436
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
372 additions
and
0 deletions
+372
-0
CMakeLists.txt
samples/cpp/CMakeLists.txt
+2
-0
bunny.ply
samples/cpp/tutorial_code/viz/bunny.ply
+0
-0
creating_widgets.cpp
samples/cpp/tutorial_code/viz/creating_widgets.cpp
+113
-0
launching_viz.cpp
samples/cpp/tutorial_code/viz/launching_viz.cpp
+66
-0
transformations.cpp
samples/cpp/tutorial_code/viz/transformations.cpp
+112
-0
widget_pose.cpp
samples/cpp/tutorial_code/viz/widget_pose.cpp
+79
-0
No files found.
samples/cpp/CMakeLists.txt
View file @
130914d9
...
...
@@ -82,6 +82,8 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND)
ocv_list_filterout
(
cpp_samples
"/gpu/"
)
endif
()
ocv_list_filterout
(
cpp_samples
"viz"
)
foreach
(
sample_filename
${
cpp_samples
}
)
get_filename_component
(
sample
${
sample_filename
}
NAME_WE
)
OPENCV_DEFINE_CPP_EXAMPLE
(
${
sample
}
${
sample_filename
}
)
...
...
samples/cpp/tutorial_code/viz/bunny.ply
0 → 100644
View file @
130914d9
This diff is collapsed.
Click to expand it.
samples/cpp/tutorial_code/viz/creating_widgets.cpp
0 → 100644
View file @
130914d9
/**
* @file creating_widgets.cpp
* @brief Creating custom widgets using VTK
* @author Ozan Cagri Tonkal
*/
#include <opencv2/viz/vizcore.hpp>
#include <opencv2/viz/widget_accessor.hpp>
#include <iostream>
#include <vtkPoints.h>
#include <vtkTriangle.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkIdList.h>
#include <vtkActor.h>
#include <vtkProp.h>
using
namespace
cv
;
using
namespace
std
;
/**
* @function help
* @brief Display instructions to use this tutorial program
*/
void
help
()
{
cout
<<
"--------------------------------------------------------------------------"
<<
endl
<<
"This program shows how to create a custom widget. You can create your own "
<<
"widgets by extending Widget2D/Widget3D, and with the help of WidgetAccessor."
<<
endl
<<
"Usage:"
<<
endl
<<
"./creating_widgets"
<<
endl
<<
endl
;
}
/**
* @class TriangleWidget
* @brief Defining our own 3D Triangle widget
*/
class
WTriangle
:
public
viz
::
Widget3D
{
public
:
WTriangle
(
const
Point3f
&
pt1
,
const
Point3f
&
pt2
,
const
Point3f
&
pt3
,
const
viz
::
Color
&
color
=
viz
::
Color
::
white
());
};
/**
* @function TriangleWidget::TriangleWidget
* @brief Constructor
*/
WTriangle
::
WTriangle
(
const
Point3f
&
pt1
,
const
Point3f
&
pt2
,
const
Point3f
&
pt3
,
const
viz
::
Color
&
color
)
{
// Create a triangle
vtkSmartPointer
<
vtkPoints
>
points
=
vtkSmartPointer
<
vtkPoints
>::
New
();
points
->
InsertNextPoint
(
pt1
.
x
,
pt1
.
y
,
pt1
.
z
);
points
->
InsertNextPoint
(
pt2
.
x
,
pt2
.
y
,
pt2
.
z
);
points
->
InsertNextPoint
(
pt3
.
x
,
pt3
.
y
,
pt3
.
z
);
vtkSmartPointer
<
vtkTriangle
>
triangle
=
vtkSmartPointer
<
vtkTriangle
>::
New
();
triangle
->
GetPointIds
()
->
SetId
(
0
,
0
);
triangle
->
GetPointIds
()
->
SetId
(
1
,
1
);
triangle
->
GetPointIds
()
->
SetId
(
2
,
2
);
vtkSmartPointer
<
vtkCellArray
>
cells
=
vtkSmartPointer
<
vtkCellArray
>::
New
();
cells
->
InsertNextCell
(
triangle
);
// Create a polydata object
vtkSmartPointer
<
vtkPolyData
>
polyData
=
vtkSmartPointer
<
vtkPolyData
>::
New
();
// Add the geometry and topology to the polydata
polyData
->
SetPoints
(
points
);
polyData
->
SetPolys
(
cells
);
// Create mapper and actor
vtkSmartPointer
<
vtkPolyDataMapper
>
mapper
=
vtkSmartPointer
<
vtkPolyDataMapper
>::
New
();
#if VTK_MAJOR_VERSION <= 5
mapper
->
SetInput
(
polyData
);
#else
mapper
->
SetInputData
(
polyData
);
#endif
vtkSmartPointer
<
vtkActor
>
actor
=
vtkSmartPointer
<
vtkActor
>::
New
();
actor
->
SetMapper
(
mapper
);
// Store this actor in the widget in order that visualizer can access it
viz
::
WidgetAccessor
::
setProp
(
*
this
,
actor
);
// Set the color of the widget. This has to be called after WidgetAccessor.
setColor
(
color
);
}
/**
* @function main
*/
int
main
()
{
help
();
/// Create a window
viz
::
Viz3d
myWindow
(
"Creating Widgets"
);
/// Create a triangle widget
WTriangle
tw
(
Point3f
(
0.0
,
0.0
,
0.0
),
Point3f
(
1.0
,
1.0
,
1.0
),
Point3f
(
0.0
,
1.0
,
0.0
),
viz
::
Color
::
red
());
/// Show widget in the visualizer window
myWindow
.
showWidget
(
"TRIANGLE"
,
tw
);
/// Start event loop
myWindow
.
spin
();
return
0
;
}
samples/cpp/tutorial_code/viz/launching_viz.cpp
0 → 100644
View file @
130914d9
/**
* @file launching_viz.cpp
* @brief Launching visualization window
* @author Ozan Cagri Tonkal
*/
#include <opencv2/viz/vizcore.hpp>
#include <iostream>
using
namespace
cv
;
using
namespace
std
;
/**
* @function help
* @brief Display instructions to use this tutorial program
*/
void
help
()
{
cout
<<
"--------------------------------------------------------------------------"
<<
endl
<<
"This program shows how to launch a 3D visualization window. You can stop event loop to continue executing. "
<<
"You can access the same window via its name. You can run event loop for a given period of time. "
<<
endl
<<
"Usage:"
<<
endl
<<
"./launching_viz"
<<
endl
<<
endl
;
}
/**
* @function main
*/
int
main
()
{
help
();
/// Create a window
viz
::
Viz3d
myWindow
(
"Viz Demo"
);
/// Start event loop
myWindow
.
spin
();
/// Event loop is over when pressed q, Q, e, E
cout
<<
"First event loop is over"
<<
endl
;
/// Access window via its name
viz
::
Viz3d
sameWindow
=
viz
::
getWindowByName
(
"Viz Demo"
);
/// Start event loop
sameWindow
.
spin
();
/// Event loop is over when pressed q, Q, e, E
cout
<<
"Second event loop is over"
<<
endl
;
/// Event loop is over when pressed q, Q, e, E
/// Start event loop once for 1 millisecond
sameWindow
.
spinOnce
(
1
,
true
);
while
(
!
sameWindow
.
wasStopped
())
{
/// Interact with window
/// Event loop for 1 millisecond
sameWindow
.
spinOnce
(
1
,
true
);
}
/// Once more event loop is stopped
cout
<<
"Last event loop is over"
<<
endl
;
return
0
;
}
samples/cpp/tutorial_code/viz/transformations.cpp
0 → 100644
View file @
130914d9
/**
* @file transformations.cpp
* @brief Visualizing cloud in different positions, coordinate frames, camera frustums
* @author Ozan Cagri Tonkal
*/
#include <opencv2/viz/vizcore.hpp>
#include <iostream>
#include <fstream>
using
namespace
cv
;
using
namespace
std
;
/**
* @function help
* @brief Display instructions to use this tutorial program
*/
void
help
()
{
cout
<<
"--------------------------------------------------------------------------"
<<
endl
<<
"This program shows how to use makeTransformToGlobal() to compute required pose,"
<<
"how to use makeCameraPose and Viz3d::setViewerPose. You can observe the scene "
<<
"from camera point of view (C) or global point of view (G)"
<<
endl
<<
"Usage:"
<<
endl
<<
"./transformations [ G | C ]"
<<
endl
<<
endl
;
}
/**
* @function cvcloud_load
* @brief load bunny.ply
*/
Mat
cvcloud_load
()
{
Mat
cloud
(
1
,
1889
,
CV_32FC3
);
ifstream
ifs
(
"bunny.ply"
);
string
str
;
for
(
size_t
i
=
0
;
i
<
12
;
++
i
)
getline
(
ifs
,
str
);
Point3f
*
data
=
cloud
.
ptr
<
cv
::
Point3f
>
();
float
dummy1
,
dummy2
;
for
(
size_t
i
=
0
;
i
<
1889
;
++
i
)
ifs
>>
data
[
i
].
x
>>
data
[
i
].
y
>>
data
[
i
].
z
>>
dummy1
>>
dummy2
;
cloud
*=
5.0
f
;
return
cloud
;
}
/**
* @function main
*/
int
main
(
int
argn
,
char
**
argv
)
{
help
();
if
(
argn
<
2
)
{
cout
<<
"Missing arguments."
<<
endl
;
return
1
;
}
bool
camera_pov
=
(
argv
[
1
][
0
]
==
'C'
);
/// Create a window
viz
::
Viz3d
myWindow
(
"Coordinate Frame"
);
/// Add coordinate axes
myWindow
.
showWidget
(
"Coordinate Widget"
,
viz
::
WCoordinateSystem
());
/// Let's assume camera has the following properties
Point3f
cam_pos
(
3.0
f
,
3.0
f
,
3.0
f
),
cam_focal_point
(
3.0
f
,
3.0
f
,
2.0
f
),
cam_y_dir
(
-
1.0
f
,
0.0
f
,
0.0
f
);
/// We can get the pose of the cam using makeCameraPose
Affine3f
cam_pose
=
viz
::
makeCameraPose
(
cam_pos
,
cam_focal_point
,
cam_y_dir
);
/// We can get the transformation matrix from camera coordinate system to global using
/// - makeTransformToGlobal. We need the axes of the camera
Affine3f
transform
=
viz
::
makeTransformToGlobal
(
Vec3f
(
0.0
f
,
-
1.0
f
,
0.0
f
),
Vec3f
(
-
1.0
f
,
0.0
f
,
0.0
f
),
Vec3f
(
0.0
f
,
0.0
f
,
-
1.0
f
),
cam_pos
);
/// Create a cloud widget.
Mat
bunny_cloud
=
cvcloud_load
();
viz
::
WCloud
cloud_widget
(
bunny_cloud
,
viz
::
Color
::
green
());
/// Pose of the widget in camera frame
Affine3f
cloud_pose
=
Affine3f
().
translate
(
Vec3f
(
0.0
f
,
0.0
f
,
3.0
f
));
/// Pose of the widget in global frame
Affine3f
cloud_pose_global
=
transform
*
cloud_pose
;
/// Visualize camera frame
if
(
!
camera_pov
)
{
viz
::
WCameraPosition
cpw
(
0.5
);
// Coordinate axes
viz
::
WCameraPosition
cpw_frustum
(
Vec2f
(
0.889484
,
0.523599
));
// Camera frustum
myWindow
.
showWidget
(
"CPW"
,
cpw
,
cam_pose
);
myWindow
.
showWidget
(
"CPW_FRUSTUM"
,
cpw_frustum
,
cam_pose
);
}
/// Visualize widget
myWindow
.
showWidget
(
"bunny"
,
cloud_widget
,
cloud_pose_global
);
/// Set the viewer pose to that of camera
if
(
camera_pov
)
myWindow
.
setViewerPose
(
cam_pose
);
/// Start event loop.
myWindow
.
spin
();
return
0
;
}
samples/cpp/tutorial_code/viz/widget_pose.cpp
0 → 100644
View file @
130914d9
/**
* @file widget_pose.cpp
* @brief Setting pose of a widget
* @author Ozan Cagri Tonkal
*/
#include <opencv2/viz/vizcore.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <iostream>
using
namespace
cv
;
using
namespace
std
;
/**
* @function help
* @brief Display instructions to use this tutorial program
*/
void
help
()
{
cout
<<
"--------------------------------------------------------------------------"
<<
endl
<<
"This program shows how to visualize a cube rotated around (1,1,1) and shifted "
<<
"using Rodrigues vector."
<<
endl
<<
"Usage:"
<<
endl
<<
"./widget_pose"
<<
endl
<<
endl
;
}
/**
* @function main
*/
int
main
()
{
help
();
/// Create a window
viz
::
Viz3d
myWindow
(
"Coordinate Frame"
);
/// Add coordinate axes
myWindow
.
showWidget
(
"Coordinate Widget"
,
viz
::
WCoordinateSystem
());
/// Add line to represent (1,1,1) axis
viz
::
WLine
axis
(
Point3f
(
-
1.0
f
,
-
1.0
f
,
-
1.0
f
),
Point3f
(
1.0
f
,
1.0
f
,
1.0
f
));
axis
.
setRenderingProperty
(
viz
::
LINE_WIDTH
,
4.0
);
myWindow
.
showWidget
(
"Line Widget"
,
axis
);
/// Construct a cube widget
viz
::
WCube
cube_widget
(
Point3f
(
0.5
,
0.5
,
0.0
),
Point3f
(
0.0
,
0.0
,
-
0.5
),
true
,
viz
::
Color
::
blue
());
cube_widget
.
setRenderingProperty
(
viz
::
LINE_WIDTH
,
4.0
);
myWindow
.
showWidget
(
"Cube Widget"
,
cube_widget
);
/// Rodrigues vector
Mat
rot_vec
=
Mat
::
zeros
(
1
,
3
,
CV_32F
);
float
translation_phase
=
0.0
,
translation
=
0.0
;
while
(
!
myWindow
.
wasStopped
())
{
/* Rotation using rodrigues */
/// Rotate around (1,1,1)
rot_vec
.
at
<
float
>
(
0
,
0
)
+=
CV_PI
*
0.01
f
;
rot_vec
.
at
<
float
>
(
0
,
1
)
+=
CV_PI
*
0.01
f
;
rot_vec
.
at
<
float
>
(
0
,
2
)
+=
CV_PI
*
0.01
f
;
/// Shift on (1,1,1)
translation_phase
+=
CV_PI
*
0.01
f
;
translation
=
sin
(
translation_phase
);
Mat
rot_mat
;
Rodrigues
(
rot_vec
,
rot_mat
);
/// Construct pose
Affine3f
pose
(
rot_mat
,
Vec3f
(
translation
,
translation
,
translation
));
myWindow
.
setWidgetPose
(
"Cube Widget"
,
pose
);
myWindow
.
spinOnce
(
1
,
true
);
}
return
0
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment