38 #include <Calibration/Calibration.h>
41 #include <TexturedRecognition/TexturedFeatureSet.h>
42 #include <TexturedRecognition/TexturedObjectDatabase.h>
43 #include <TexturedRecognition/TexturedRecognition.h>
51 TexturedObjectRecognition::initRecognizer()
53 float SIFTThreshold = getProperty<float>(
"SIFTThreshold").getValue();
55 texturedRecognition =
new CTexturedRecognition(
56 getImageFormat().dimension.width, getImageFormat().dimension.height, SIFTThreshold);
57 texturedRecognition->SetVerbose(
true);
58 texturedRecognition->SetStereo(
true);
59 texturedRecognition->SetQualityThreshold(getProperty<float>(
"QualityThreshold").getValue());
60 texturedRecognition->SetRecognitionThresholds(getProperty<int>(
"nMinValidFeatures").getValue(),
61 getProperty<float>(
"MaxError").getValue());
64 Eigen::Vector3f minPoint = getProperty<Eigen::Vector3f>(
"MinPoint").getValue();
65 Eigen::Vector3f maxPoint = getProperty<Eigen::Vector3f>(
"MaxPoint").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();
72 correlationThreshold = getProperty<float>(
"StereoCorrelationThreshold").getValue();
74 texturedRecognition->GetObjectDatabase()->InitCameraParameters(getStereoCalibration(),
true);
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();
107 memoryx::ObjectLocalizationResultList
108 TexturedObjectRecognition::localizeObjectClasses(
const std::vector<std::string>& objectClassNames,
109 CByteImage** cameraImages,
110 armarx::MetaInfoSizeBasePtr imageMetaInfo,
111 CByteImage** resultImages)
113 std::string allObjectNames;
115 for (
size_t i = 0; i < objectClassNames.size(); i++)
117 allObjectNames.append(objectClassNames.at(i));
118 allObjectNames.append(
" ");
124 CByteImage** tmpResultImages = getResultImagesEnabled() ? resultImages : NULL;
126 if (objectClassNames.size() == 1)
128 texturedRecognition->DoRecognitionSingleObject(cameraImages,
130 objectClassNames.at(0).c_str(),
133 getImagesAreUndistorted());
138 texturedRecognition->DoRecognition(
139 cameraImages, tmpResultImages,
true, 50, getImagesAreUndistorted());
142 Object3DList objectList = texturedRecognition->GetObject3DList();
144 ARMARX_DEBUG_S <<
"Localized " << objectList.size() <<
" objects";
145 const auto agentName = getProperty<std::string>(
"AgentName").getValue();
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;
163 mapValues[
"x"] =
new Variant(x);
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++);
168 mapValues[
"timestamp"] =
new Variant(imageMetaInfo->timeProvided / 1000.0 / 1000.0);
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);
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);
199 calculateLocalizationUncertainty(position);
200 Eigen::MatrixXf cov = posUncertainty->toEigenCovariance();
201 cov *= 4.0f / pow(result.recognitionCertainty, 4);
206 result.objectClassName = iter->sName;
209 resultList.push_back(result);
211 FramedPose objectPose(orientation, position, referenceFrameName, agentName);
216 ARMARX_DEBUG_S <<
"Refused unrealistic localization at position: " << x <<
" " << y
226 TexturedObjectRecognition::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;