Skip to content

Commit df56501

Browse files
peci1iche033
authored andcommitted
fix(thermal_camera): Fixed Gaussian noise for thermal camera. (#597)
Signed-off-by: Martin Pecka <peci1@seznam.cz> (cherry picked from commit 0e561e3)
1 parent 4879404 commit df56501

File tree

4 files changed

+36
-5
lines changed

4 files changed

+36
-5
lines changed

src/ThermalCameraSensor.cc

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
#include "gz/sensors/ThermalCameraSensor.hh"
3535
#include "gz/sensors/ImageGaussianNoiseModel.hh"
36+
#include "gz/sensors/ImageNoise.hh"
3637
#include "gz/sensors/RenderingEvents.hh"
3738
#include "gz/sensors/SensorFactory.hh"
3839

@@ -319,12 +320,20 @@ bool ThermalCameraSensor::CreateCamera()
319320
// Add gaussian noise to camera sensor
320321
if (noiseSdf.Type() == sdf::NoiseType::GAUSSIAN)
321322
{
322-
this->dataPtr->noises[noiseType] =
323-
NoiseFactory::NewNoiseModel(noiseSdf, "camera");
323+
// Skip applying noise if mean and stddev are 0 - this avoids
324+
// doing an extra render pass in gz-rendering
325+
// Note ImageGaussianNoiseModel only uses mean and stddev and does not
326+
// use bias parameters.
327+
if (!math::equal(noiseSdf.Mean(), 0.0) ||
328+
!math::equal(noiseSdf.StdDev(), 0.0))
329+
{
330+
this->dataPtr->noises[noiseType] =
331+
ImageNoiseFactory::NewNoiseModel(noiseSdf, "thermal_camera");
324332

325-
std::dynamic_pointer_cast<ImageGaussianNoiseModel>(
326-
this->dataPtr->noises[noiseType])->SetCamera(
327-
this->dataPtr->thermalCamera);
333+
std::dynamic_pointer_cast<ImageGaussianNoiseModel>(
334+
this->dataPtr->noises[noiseType])->SetCamera(
335+
this->dataPtr->thermalCamera);
336+
}
328337
}
329338
else if (noiseSdf.Type() != sdf::NoiseType::NONE)
330339
{

test/integration/thermal_camera.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,12 @@ void ThermalCameraSensorTest::ImagesWithBuiltinSDF(
132132
auto imagePtr = cameraPtr->GetElement("image");
133133
ASSERT_TRUE(cameraPtr->HasElement("clip"));
134134
auto clipPtr = cameraPtr->GetElement("clip");
135+
ASSERT_TRUE(cameraPtr->HasElement("noise"));
136+
auto noisePtr = cameraPtr->GetElement("noise");
137+
138+
EXPECT_EQ("gaussian", noisePtr->Get<std::string>("type"));
139+
EXPECT_FLOAT_EQ(0.0, noisePtr->Get<double>("mean"));
140+
EXPECT_DOUBLE_EQ(0.007, noisePtr->Get<double>("stddev"));
135141

136142
int imgWidth = imagePtr->Get<int>("width");
137143
int imgHeight = imagePtr->Get<int>("height");
@@ -392,6 +398,12 @@ void ThermalCameraSensorTest::Images8BitWithBuiltinSDF(
392398
auto cameraPtr = sensorPtr->GetElement("camera");
393399
ASSERT_TRUE(cameraPtr->HasElement("image"));
394400
auto imagePtr = cameraPtr->GetElement("image");
401+
ASSERT_TRUE(cameraPtr->HasElement("noise"));
402+
auto noisePtr = cameraPtr->GetElement("noise");
403+
404+
EXPECT_EQ("gaussian", noisePtr->Get<std::string>("type"));
405+
EXPECT_FLOAT_EQ(0.0, noisePtr->Get<double>("mean"));
406+
EXPECT_DOUBLE_EQ(0.007, noisePtr->Get<double>("stddev"));
395407

396408
std::string format = imagePtr->Get<std::string>("format");
397409
EXPECT_EQ("L8", format);

test/sdf/thermal_camera_sensor_8bit_builtin.sdf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
<near>0.1</near>
1717
<far>10.0</far>
1818
</clip>
19+
<noise>
20+
<type>gaussian</type>
21+
<mean>0.0</mean>
22+
<stddev>0.007</stddev>
23+
</noise>
1924
</camera>
2025
</sensor>
2126
</link>

test/sdf/thermal_camera_sensor_builtin.sdf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
<near>0.1</near>
1717
<far>10.0</far>
1818
</clip>
19+
<noise>
20+
<type>gaussian</type>
21+
<mean>0.0</mean>
22+
<stddev>0.007</stddev>
23+
</noise>
1924
</camera>
2025
</sensor>
2126
</link>

0 commit comments

Comments
 (0)