Exemple #1
0
double CFS::cost (ElementSubset * X)
{
  timeval begin, end;
  gettimeofday (& begin, NULL);

  double cost;

  number_of_calls_of_cost_function++;

  if (set->get_set_cardinality () == 0)
    cost = 0;
  else if (X->get_subset_cardinality () == 0)
    cost = INFTY;
  else
    cost = - evaluateSubset (X);

  gettimeofday (& end, NULL);
  elapsed_time_of_cost_function_calls += diff_us (end, begin);

  // Threshold is a maximum number of calls of the cost function
  //
  if ((has_max_number_of_calls_set) &&
      (number_of_calls_of_cost_function >=
       max_number_of_calls_of_cost_function))
    reached_threshold = true;

  return cost;
}
void SegmenterSimple::compute() {
  std::vector<VoxelSubset> subsets;
  VoxelSubset whole_mesh(voxels_);
  for (int i = 0; i < voxels_->nVoxels(); ++i) {
    whole_mesh.addVoxel(i);
  }
  whole_mesh.calculateConvexHull();
  subsets.push_back(whole_mesh);

  // Segmentation algorithm:
  // Keep a list with all current parts, starting with whole modedl
  // In every pass, try to split each part along a plane
  // Brute-Force search: evaluate all split planes, take best
  for (unsigned int pass = 0; pass < passes_; ++pass) {
    std::cout << "Pass " << pass << std::endl;
    bool changed = false;
    // evaluation_blend_ = (pass+1) / (passes_+1);
    std::vector<VoxelSubset> new_subsets;
    for (unsigned int subset_index = 0; subset_index < subsets.size();
         ++subset_index) {
      if (subsets[subset_index].isFinal()) {
        new_subsets.push_back(subsets[subset_index]);
        continue;
      }

      std::vector<VoxelSubset> best_partition;
      best_partition.push_back(subsets[subset_index]);
      Real best_value =
          evaluateSubset(subsets[subset_index]) -
          min_gain_;  //<-Bonus for no split to avoide overly-precise splitting
      if (subsets[subset_index].isFinal()) {
        new_subsets.push_back(subsets[subset_index]);
        continue;
      }

      std::vector<Split> possible_splits =
          generateSplits(subsets[subset_index]);

      for (unsigned int split_index = 0; split_index < possible_splits.size();
           ++split_index) {
        Split& split = possible_splits[split_index];
        std::vector<VoxelSubset> new_partition =
            subsets[subset_index].partition(split);
        Real new_value =
            evaluatePartition(subsets[subset_index], new_partition);

        if (new_value < best_value) {
          best_partition = new_partition;
          best_value = new_value;
        }
      }
      // std::cout<<"Best split value: "<<best_value<<std::endl;
      if (best_partition.size() == 1) {
        best_partition[0].setFinal();
      } else {
        changed = true;
      }
      new_subsets.insert(new_subsets.end(), best_partition.begin(),
                         best_partition.end());
    }
    if (!changed) break;
    subsets = new_subsets;
  }

  subsets_ = subsets;
  for (unsigned int i = 0; i < subsets_.size(); ++i) {
    segmentation_.push_back(subsets_[i].getConvexHull());
  }
}