149 std::lock_guard<std::mutex> lock(mutex);
151 pcl::PointCloud<pcl::PointXYZRGBA>::Ptr currentPointCloud(
152 new pcl::PointCloud<pcl::PointXYZRGBA>());
186 saliencyEgosphereGraph->set(0.0);
188 const int scaleFactor = 4;
190 int width = images[0]->width / scaleFactor;
191 int height = images[0]->height / scaleFactor;
192 CByteImage* image =
new CByteImage(width, height, CByteImage::eRGB24);
193 ::ImageProcessor::Resize(images[0], image);
195 ARMARX_VERBOSE <<
"downscaling image to: " << width <<
"x" << height;
198 CFloatImage* saliencyImage =
new CFloatImage(width, height, 1);
204 hog->findSalientRegions(image, saliencyImage);
206 std::vector<cv::Point2f> points;
209 std::map<int, int> saliencyHist;
210 float priorityProcent = 0.9;
212 int intensityThreshold = 255;
214 int saliencyImageWidth = saliencyImage->width;
216 for (
int i = 0; i < saliencyImage->height; i++)
218 for (
int j = 0; j < saliencyImageWidth; j++)
220 saliencyHist[(int)(saliencyImage->pixels[i * saliencyImageWidth + j] * 255.0)]++;
225 int usefulSampleAmount =
226 priorityProcent * (saliencyImage->width * saliencyImage->height - saliencyHist[0]);
227 for (
int i = 1; i <= 255; i++)
229 if (!saliencyHist.count(i))
233 saliencySum += saliencyHist[i];
234 if (saliencySum > usefulSampleAmount)
236 intensityThreshold = i;
241 for (
int i = 0; i < saliencyImage->height; i++)
243 for (
int j = 0; j < saliencyImageWidth; j++)
245 if (saliencyImage->pixels[i * saliencyImageWidth + j] * 255.0 > intensityThreshold)
247 points.push_back(cv::Point2f(j, i));
252 cv::Mat samples(points.size(), 2, CV_32F);
253 for (
size_t i = 0; i < points.size(); i++)
255 samples.at<
float>(i, 0) = points[i].
x;
256 samples.at<
float>(i, 1) = points[i].y;
264 cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 20, 0.1),
266 cv::KMEANS_PP_CENTERS,
271 std::map<int, int> numberOfEachCluster;
272 for (
int i = 0; i < samples.rows; i++)
274 numberOfEachCluster[outputLable.at<
int>(i, 0)]++;
276 size_t maxCluster = 0;
278 for (
size_t i = 0; i < numberOfEachCluster.size(); i++)
280 if (numberOfEachCluster[i] > numberOfEachCluster[maxCluster])
293 for (
size_t i = 0; i < numberOfEachCluster.size(); i++)
295 if ((i != maxCluster) && numberOfEachCluster[i] > numberOfEachCluster[secondCluster])
308#pragma omp parallel for
309 for (
int i = 0; i < images[0]->height; i++)
311 for (
int j = 0; j < images[0]->width; j++)
313 int idx = i * images[0]->width + j;
316 saliencyImage->pixels[(i / scaleFactor * width) + (j / scaleFactor)];
318 result[1]->pixels[3 * idx + 0] = 255 * saliency;
319 result[1]->pixels[3 * idx + 1] = 255 * saliency;
320 result[1]->pixels[3 * idx + 2] = 255 * saliency;
322 result[2]->pixels[3 * idx + 0] =
323 (0.2 + 0.8 * saliency) * result[0]->pixels[3 * idx + 0];
324 result[2]->pixels[3 * idx + 1] =
325 (0.2 + 0.8 * saliency) * result[0]->pixels[3 * idx + 1];
326 result[2]->pixels[3 * idx + 2] =
327 (0.2 + 0.8 * saliency) * result[0]->pixels[3 * idx + 2];
392 for (
int i = 0; i < centers.rows; i++)
395 ((int)centers.at<
float>(i, 1) * width) + ((
int)centers.at<
float>(i, 0));
396 int idx = (int)centers.at<
float>(i, 1) * scaleFactor * images[0]->width +
397 (int)centers.at<
float>(i, 0) * scaleFactor;
399 float saliency = saliencyImage->pixels[downScaleIdx];
401 if (idx >= (
int)currentPointCloud->points.size())
406 Eigen::Vector3f vec = currentPointCloud->points[idx].getVector3fMap();
408 if (!pcl::isFinite(currentPointCloud->points[idx]))
415 vec,
"DepthCamera", robotStateComponent->getSynchronizedRobot()->getName());
416 currentViewTarget->changeFrame(robot, headFrameName);
419 int closestNodeIndex = graphLookupTable->getClosestNode(positionInSphereCoordinates);
421 float halfCameraOpeningAngle = 12.0 *
M_PI / 180.0;
422 float modifiedHalfCameraOpeningAngle = halfCameraOpeningAngle;
423 float distance = currentViewTarget->toEigen().norm();
432 const float distanceThreshold = 1500;
435 modifiedHalfCameraOpeningAngle = (
distance - 0.1f * distanceThreshold) /
436 (0.9f * distanceThreshold) *
437 halfCameraOpeningAngle;
438 modifiedHalfCameraOpeningAngle = std::max(0.0f, modifiedHalfCameraOpeningAngle);
442 std::vector<bool> visitedNodes(saliencyEgosphereGraph->getNodes()->size(),
false);
443 addSaliencyRecursive(closestNodeIndex,
446 positionInSphereCoordinates,
447 modifiedHalfCameraOpeningAngle);
453 for (std::size_t row = 0; centers.rows > 0 && row < static_cast<std::size_t>(centers.rows);
456 for (std::size_t i = 0; i < 8; i++)
458 for (std::size_t j = 0; j < 8; j++)
461 3 * (((int)centers.at<
float>(row, 1) * scaleFactor + i) * images[0]->width +
462 ((int)centers.at<
float>(row, 0) * scaleFactor + j));
463 result[2]->pixels[
index] = 255;
464 result[2]->pixels[
index + 1] = 255 * (row == maxCluster);
465 result[2]->pixels[
index + 2] =
466 255 * (row ==
static_cast<std::size_t
>(secondCluster));
478 SaliencyMapBasePtr primitiveSaliency =
new SaliencyMapBase();
479 primitiveSaliency->name =
"ValveAttention";
480 saliencyEgosphereGraph->graphToVec(primitiveSaliency->map);
481 viewSelection->updateSaliencyMap(primitiveSaliency);