/** Set the data costs of the MRF. */ void set_data_costs(std::vector<FaceInfo> const & face_infos, ST const & data_costs, std::vector<mrf::Graph::Ptr> const & mrfs) { /* Set data costs for all labels except label 0 (undefined) */ for (std::size_t i = 0; i < data_costs.rows(); i++) { ST::Row const & data_costs_for_label = data_costs.row(i); std::vector<std::vector<mrf::SparseDataCost> > costs(mrfs.size()); for(std::size_t j = 0; j < data_costs_for_label.size(); j++) { const std::size_t id = data_costs_for_label[j].first; const float data_cost = data_costs_for_label[j].second; const std::size_t component = face_infos[id].component; const std::size_t cid = face_infos[id].id; //TODO change index type of mrf::Graph costs[component].push_back({static_cast<int>(cid), data_cost}); } int label = i + 1; for (std::size_t j = 0; j < mrfs.size(); ++j) { mrfs[j]->set_data_costs(label, costs[j]); } } for (std::size_t i = 0; i < mrfs.size(); ++i) { /* Set costs for undefined label */ std::vector<mrf::SparseDataCost> costs(mrfs[i]->num_sites()); for (std::size_t j = 0; j < costs.size(); j++) { costs[j].site = j; costs[j].cost = MRF_MAX_ENERGYTERM; } mrfs[i]->set_data_costs(0, costs); } }