38#include <Calibration/Calibration.h>
41#include <TexturedRecognition/TexturedFeatureSet.h>
42#include <TexturedRecognition/TexturedObjectDatabase.h>
43#include <TexturedRecognition/TexturedRecognition.h>
55 texturedRecognition =
new CTexturedRecognition(
57 texturedRecognition->SetVerbose(
true);
58 texturedRecognition->SetStereo(
true);
59 texturedRecognition->SetQualityThreshold(
getProperty<float>(
"QualityThreshold").getValue());
60 texturedRecognition->SetRecognitionThresholds(
getProperty<int>(
"nMinValidFeatures").getValue(),
67 Math3d::SetVec(validResultBoundingBoxMin, minPoint(0), minPoint(1), minPoint(2));
68 Math3d::SetVec(validResultBoundingBoxMax, maxPoint(0), maxPoint(1), maxPoint(2));
71 correlationWindowSize =
getProperty<int>(
"StereoCorrelationWindowSize").getValue();
75 texturedRecognition->GetObjectDatabase()->SetCorrelationParameters(
76 correlationWindowSize, minPoint(2), maxPoint(2), correlationThreshold);
87 std::string fileName = recognitionWrapper->getFeatureFile();
91 std::string className = objectClassEntity->getName();
93 if (texturedRecognition->GetObjectDatabase()->AddClass(className, fileName))
101 << objectClassEntity->getName();
107memoryx::ObjectLocalizationResultList
113 std::string allObjectNames;
115 for (
size_t i = 0; i < objectClassNames.size(); i++)
117 allObjectNames.append(objectClassNames.at(i));
118 allObjectNames.append(
" ");
126 if (objectClassNames.size() == 1)
128 texturedRecognition->DoRecognitionSingleObject(
cameraImages,
130 objectClassNames.at(0).c_str(),
138 texturedRecognition->DoRecognition(
142 Object3DList objectList = texturedRecognition->GetObject3DList();
144 ARMARX_DEBUG_S <<
"Localized " << objectList.size() <<
" objects";
147 memoryx::ObjectLocalizationResultList resultList;
149 for (Object3DList::iterator iter = objectList.begin(); iter < objectList.end(); iter++)
153 (std::find(objectClassNames.begin(), objectClassNames.end(), iter->sName) !=
154 objectClassNames.end());
156 if (iter->localizationValid && queriedClass)
158 float x = iter->pose.translation.x;
159 float y = iter->pose.translation.y;
160 float z = iter->pose.translation.z;
164 mapValues[
"y"] =
new Variant(y);
165 mapValues[
"z"] =
new Variant(z);
166 mapValues[
"name"] =
new Variant(iter->sName);
167 mapValues[
"sequence"] =
new Variant(seq++);
169 debugObserver->setDebugChannel(
"ObjectRecognition", mapValues);
173 if (
x > validResultBoundingBoxMin.x && y > validResultBoundingBoxMin.y &&
174 z > validResultBoundingBoxMin.z &&
x < validResultBoundingBoxMax.x &&
175 y < validResultBoundingBoxMax.y && z < validResultBoundingBoxMax.z)
178 memoryx::ObjectLocalizationResult result;
181 Eigen::Vector3f position(
x, y, z);
182 Eigen::Matrix3f orientation;
183 orientation << iter->pose.rotation.r1, iter->pose.rotation.r2,
184 iter->pose.rotation.r3, iter->pose.rotation.r4, iter->pose.rotation.r5,
185 iter->pose.rotation.r6, iter->pose.rotation.r7, iter->pose.rotation.r8,
186 iter->pose.rotation.r9;
194 result.recognitionCertainty =
195 0.5f + 0.5f * calculateRecognitionCertainty(iter->sName, *iter);
200 Eigen::MatrixXf cov = posUncertainty->toEigenCovariance();
201 cov *= 4.0f / pow(result.recognitionCertainty, 4);
206 result.objectClassName = iter->sName;
209 resultList.push_back(result);
216 ARMARX_DEBUG_S <<
"Refused unrealistic localization at position: " <<
x <<
" " << y
226TexturedObjectRecognition::calculateRecognitionCertainty(
const std::string& objectClassName,
227 const Object3DEntry& entry)
235 int objectIndex = -1;
236 int n = texturedRecognition->GetObjectDatabase()->GetSize();
238 for (
int i = 0; i < n; i++)
240 if (objectClassName.compare(
241 texturedRecognition->GetObjectDatabase()->GetFeatureSet(i)->GetName()) == 0)
248 if (objectIndex == -1)
253 int numberObjectFeatures =
254 texturedRecognition->GetObjectDatabase()->GetFeatureSet(objectIndex)->GetSize();
257 float temp = (entry.quality > 0.7f) ? entry.quality - 0.7f : 0;
258 float ratingPixelError = expf(-(4.0f / 9.0f) * temp * temp);
259 ratingPixelError = 0.15f + 0.7f * ratingPixelError;
262 temp = 0.1f * (entry.quality2 - 20.0f);
263 float ratingMatchedFeaturesAbsolute = 0.5f + 0.5f * (temp / sqrtf(1.0f + temp * temp));
264 ratingMatchedFeaturesAbsolute = 0.15f + 0.7f * ratingMatchedFeaturesAbsolute;
267 if (numberObjectFeatures > 300)
269 numberObjectFeatures = 300;
272 temp = entry.quality2;
274 if (temp > (
float)numberObjectFeatures)
276 temp = (
float)numberObjectFeatures;
279 float ratingMatchedFeaturesRelative = temp / (0.15f * (
float)numberObjectFeatures);
280 ratingMatchedFeaturesRelative =
281 (ratingMatchedFeaturesRelative > 1.0f) ? 1.0f : ratingMatchedFeaturesRelative;
282 ratingMatchedFeaturesRelative = 0.15f + 0.7f * ratingMatchedFeaturesRelative;
285 float recognitionCertainty =
286 (ratingPixelError * ratingMatchedFeaturesAbsolute * ratingMatchedFeaturesRelative) /
287 ((ratingPixelError * ratingMatchedFeaturesAbsolute * ratingMatchedFeaturesRelative) +
288 ((1 - ratingPixelError) * (1 - ratingMatchedFeaturesAbsolute) *
289 (1 - ratingMatchedFeaturesRelative)));
291 return recognitionCertainty;
Property< PropertyType > getProperty(const std::string &name)
The FramedOrientation class.
The FramedPosition class.
Implements a Variant type for timestamps.
The Variant class is described here: Variants.
TexturedRecognitionWrapper offers a simplified access to the data of an object class or instance rela...
The MultivariateNormalDistribution class.
CByteImage * cameraImages[2]
ImageFormatInfo getImageFormat() const
Retrieve format of input images.
bool getImagesAreUndistorted() const
Retrieve whether images are undistorted.
std::string referenceFrameName
bool getResultImagesEnabled() const
Retrieve whether result images are enabled.
memoryx::MultivariateNormalDistributionPtr calculateLocalizationUncertainty(Vec2d left_point, Vec2d right_point)
Calculate 3D uncertainty from two 2d points in left and right camera.
armarx::MetaInfoSizeBasePtr imageMetaInfo
CStereoCalibration * getStereoCalibration() const
Retrieve stereo calibration corresponding to image provider.
CByteImage ** resultImages
bool initRecognizer() override
Initializes textured recognition.
memoryx::ObjectLocalizationResultList localizeObjectClasses(const std::vector< std::string > &objectClassNames, CByteImage **cameraImages, armarx::MetaInfoSizeBasePtr imageMetaInfo, CByteImage **resultImages) override
localizes textured object instances
bool addObjectClass(const memoryx::EntityPtr &objectClassEntity, const memoryx::GridFileManagerPtr &fileManager) override
Add object class to textured object recognition.
#define ARMARX_DEBUG_S
The logging level for output that is only interesting while debugging.
#define ARMARX_WARNING_S
The logging level for unexpected behaviour, but not a serious problem.
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::map< std::string, VariantBasePtr > StringVariantBaseMap
IceInternal::Handle< TexturedRecognitionWrapper > TexturedRecognitionWrapperPtr
IceInternal::Handle< MultivariateNormalDistribution > MultivariateNormalDistributionPtr
IceInternal::Handle< Entity > EntityPtr
Typedef of EntityPtr as IceInternal::Handle<Entity> for convenience.
std::shared_ptr< GridFileManager > GridFileManagerPtr