41#include <geometric_shapes/shapes.h>
42#include <geometric_shapes/shape_operations.h>
50#ifdef HAVE_SSE_EXTENSIONS
56 const std::string& render_vertex_shader,
57 const std::string& render_fragment_shader,
58 const std::string& filter_vertex_shader,
59 const std::string& filter_fragment_shader)
70 std::thread([
this, render_vertex_shader, render_fragment_shader, filter_vertex_shader, filter_fragment_shader] {
71 run(render_vertex_shader, render_fragment_shader, filter_vertex_shader, filter_fragment_shader);
76 const std::string& render_fragment_shader,
77 const std::string& filter_vertex_shader,
78 const std::string& filter_fragment_shader)
87 mesh_renderer_->setShadersFromString(render_vertex_shader, render_fragment_shader);
88 depth_filter_->setShadersFromString(filter_vertex_shader, filter_fragment_shader);
94 glUniform1i(glGetUniformLocation(
depth_filter_->getProgramID(),
"sensor"), 0);
95 glUniform1i(glGetUniformLocation(
depth_filter_->getProgramID(),
"depth"), 2);
96 glUniform1i(glGetUniformLocation(
depth_filter_->getProgramID(),
"label"), 4);
103 glNewList(
canvas_, GL_COMPILE);
108 glVertex3f(-1, -1, 1);
111 glVertex3f(1, -1, 1);
117 glVertex3f(-1, 1, 1);
160 mesh_renderer_->setCameraParameters(width, width, width >> 1, height >> 1);
163 depth_filter_->setCameraParameters(width, width, width >> 1, height >> 1);
195 meshes_[handle] = std::make_shared<GLMesh>(cmesh, handle);
207 throw std::runtime_error(
"Could not remove mesh. Mesh not found!");
213 std::size_t erased =
meshes_.erase(handle);
214 return (erased != 0);
225 [&renderer = *
mesh_renderer_, labels] { renderer.getColorBuffer(
reinterpret_cast<unsigned char*
>(labels)); }));
233 std::make_shared<FilterJob<void>>([&renderer = *
mesh_renderer_, depth] { renderer.getDepthBuffer(depth); });
234 JobPtr job2 = std::make_shared<FilterJob<void>>(
235 [¶meters = *
sensor_parameters_, depth] { parameters.transformModelDepthToMetricDepth(depth); });
249 JobPtr job2 = std::make_shared<FilterJob<void>>(
250 [¶meters = *
sensor_parameters_, depth] { parameters.transformFilteredDepthToMetricDepth(depth); });
263 JobPtr job = std::make_shared<FilterJob<void>>(
270 const std::string& render_fragment_shader,
271 const std::string& filter_vertex_shader,
272 const std::string& filter_fragment_shader)
274 initialize(render_vertex_shader, render_fragment_shader, filter_vertex_shader, filter_fragment_shader);
297 if (type != GL_FLOAT && type != GL_UNSIGNED_SHORT)
299 std::stringstream msg;
300 msg <<
"unknown type \"" << type <<
"\". Allowed values are GL_FLOAT or GL_UNSIGNED_SHORT.";
301 throw std::runtime_error(msg.str());
304 JobPtr job = std::make_shared<FilterJob<void>>([
this, sensor_data, type] {
doFilter(sensor_data, type); });
317 glEnable(GL_TEXTURE_2D);
318 glEnable(GL_DEPTH_TEST);
319 glDepthFunc(GL_LESS);
320 glEnable(GL_CULL_FACE);
321 glCullFace(GL_FRONT);
322 glDisable(GL_ALPHA_TEST);
325 GLuint padding_coefficients_id = glGetUniformLocation(
mesh_renderer_->getProgramID(),
"padding_coefficients");
326 Eigen::Vector3f padding_coefficients =
328 glUniform3f(padding_coefficients_id, padding_coefficients[0], padding_coefficients[1], padding_coefficients[2]);
330 Eigen::Isometry3d transform;
331 for (
const std::pair<const MeshHandle, GLMeshPtr>& mesh :
meshes_)
334 mesh.second->render(transform);
344 glEnable(GL_TEXTURE_2D);
345 glEnable(GL_DEPTH_TEST);
346 glDepthFunc(GL_ALWAYS);
347 glDisable(GL_CULL_FACE);
348 glDisable(GL_ALPHA_TEST);
359 glActiveTexture(GL_TEXTURE0);
365 if (encoding == GL_UNSIGNED_SHORT)
372 glPixelTransferf(GL_DEPTH_SCALE, scale * 65.535);
376 glPixelTransferf(GL_DEPTH_SCALE, scale);
378 glPixelTransferf(GL_DEPTH_BIAS, -scale *
sensor_parameters_->getNearClippingPlaneDistance());
381 GL_DEPTH_COMPONENT, encoding, sensor_data);
382 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
383 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
384 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
385 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
388 glActiveTexture(GL_TEXTURE2);
389 glBindTexture(GL_TEXTURE_2D, depth_texture);
392 glActiveTexture(GL_TEXTURE4);
393 glBindTexture(GL_TEXTURE_2D, color_texture);
const ReturnType & getResult() const
void setTransformCallback(const TransformCallback &transform_callback)
set the callback for retrieving transformations for each mesh.
std::mutex transform_callback_mutex_
mutex for synchronization of setting/calling transform_callback_
void doFilter(const void *sensor_data, const int encoding) const
the filter method that does the magic
void getModelLabels(LabelType *labels) const
retrieves the labels of the rendered model
std::map< MeshHandle, GLMeshPtr > meshes_
storage for meshed to be filtered
void filter(const void *sensor_data, GLushort type, bool wait=false) const
label/remove pixels from input depth-image
SensorModel::ParametersPtr sensor_parameters_
the parameters of the used sensor model
GLuint sensor_depth_texture_
handle depth texture from sensor data
GLuint shadow_threshold_location_
handle to GLSL location of shadow threshold
MeshFilterBase(const TransformCallback &transform_callback, const SensorModel::Parameters &sensor_parameters, const std::string &render_vertex_shader="", const std::string &render_fragment_shader="", const std::string &filter_vertex_shader="", const std::string &filter_fragment_shader="")
Constructor.
bool removeMeshHelper(MeshHandle handle)
used within a Job to allow the main thread removing meshes
~MeshFilterBase()
Destructor.
std::queue< JobPtr > jobs_queue_
OpenGL job queue that need to be processed by the worker thread.
void run(const std::string &render_vertex_shader, const std::string &render_fragment_shader, const std::string &filter_vertex_shader, const std::string &filter_fragment_shader)
filtering thread
bool stop_
indicates whether the filtering loop should stop
void addMeshHelper(MeshHandle handle, const shapes::Mesh &cmesh)
used within a Job to allow the main thread adding meshes
float padding_offset_
padding offset
GLRendererPtr depth_filter_
second pass renderer for filtering the results of first pass
void removeMesh(MeshHandle mesh_handle)
removes a mesh given by its handle
GLRendererPtr mesh_renderer_
first pass renderer for rendering the mesh
void initialize(const std::string &render_vertex_shader, const std::string &render_fragment_shader, const std::string &filter_vertex_shader, const std::string &filter_fragment_shader)
initializes OpenGL related things as well as renderers
void addJob(const JobPtr &job) const
add a Job for the main thread that needs to be executed there
MeshHandle next_handle_
next handle to be used for next mesh that is added
void setShadowThreshold(float threshold)
set the shadow threshold. points that are further away than the rendered model are filtered out....
float padding_scale_
padding scale
void deInitialize()
cleaning up
MeshHandle min_handle_
Handle values below this are all taken (this variable is used for more efficient computation of next_...
MeshHandle addMesh(const shapes::Mesh &mesh)
adds a mesh to the filter object.
TransformCallback transform_callback_
callback function for retrieving the mesh transformations
std::function< bool(MeshHandle, Eigen::Isometry3d &)> TransformCallback
void setPaddingOffset(float offset)
set the offset component of padding. This value is added to the scaled sensor-specific constant compo...
void getModelDepth(float *depth) const
retrieves the depth values of the rendered model
void getFilteredLabels(LabelType *labels) const
retrieves the labels of the input data
std::thread filter_thread_
the filtering thread that also holds the OpenGL context
void getFilteredDepth(float *depth) const
retrieves the filtered depth values
void setPaddingScale(float scale)
set the scale component of padding used to multiply with sensor-specific padding coefficients to get ...
void setSize(unsigned int width, unsigned int height)
sets the size of the frame buffers
std::mutex meshes_mutex_
mutex for synchronization of updating filtered meshes
std::condition_variable jobs_condition_
condition variable to notify the filtering thread if a new image arrived
std::mutex jobs_mutex_
mutex required for synchronization of condition states
float shadow_threshold_
threshold for shadowed pixels vs. filtered pixels
GLuint canvas_
canvas element (screen-filling quad) for second pass
Abstract Interface defining Sensor Parameters.