C++ cv::Mat

Bzaina

1st Folding then Sex
Boas.

Preciso de uma ajudinha... tenho uma matrix criada que contem um trajecto... a matrix é um mapa à escala de cinzentos (tem o valor 0 para espaço ocupado e 255 para espaço vazio).
Tenho um algoritmo que calcula um trajecto nessa matrix, "pintando" uma linha a vermelho (ou seja, substituinto as células a 255 (branco?) por vermelho, com o vec3b(0,0,255)).

Como é que eu consigo ir "listando" as células que estão a vermelho? Há alguma maneira? Basicamente quero que um robô siga o trajecto calculado (a vermelho) mas preciso de o mandar "ir andando" célula a célula.. alguma ajuda??
 
Estou a tentar fazer algo do género:
Código:
 if(map_color.at<uchar>(startypx, startxpx+1) == cv::Vec3b(0,0,255)){
              next_target.x = startxpx + 1;
              next_target.y = startypx;
           }

Mas está-me a dar erro ""no match for 'operator ==' in 'map.cv::Mat::at[with_Tp = unsigned char] .." Alguém?
 
Vou mandar uma dica totalmente infundada, porque não conheço as bibliotecas que estás a usar:
Porque é que não comparas os valores das cores separadamente, deve estar a dar erro porque o map_color.at retorna uma objeto diferente do cv::Vec3b e não existe nenhum operador == para comparar os dois.
Qualquer coisa deste genero:
if (map_color.at(startypx, startxpx+1).r == 0 && map_color.at(startypx, startxpx+1).g == 0 && map_color.at(startypx, startxpx+1).b == 255)

​(mais uma vez, é só um palpite)

edit:
encontrei isto com uma pesquisa rápida no google, pode ser que ajude:
map_color.at<cv::Vec3b > (y,x);
 
Última edição:
Obrigado pela resposta.

Vou tentar a sugestão que deu.
Quanto aos resultados da pesquisa, também já tinha encontrado mas não consegui fazer nada :D

A maneira mais prática até seria conseguir ter acesso a um ficheiro.cpp que também pertence ao projecto.

Basicamente, tenho num ficheiro que calcula essa tal matriz e até há uma parte do código, com uma função, que mostra os pontos que quero no output da aplicação.

Código:
void Graph::showPath(MapPoint goal_position)
{
  std::list<MapPoint> finalPath;
  std::list<MapPoint>::iterator listIt;

  // Get goal node
  Node* node = nodes_list_[goal_position.label];
  // Cycle through all available nodes starting from the goal to the start
  //node
  while(1)
  {
    finalPath.push_front(node->map_position_);
    // get this node parent
    node = node->parent_;
    // if this new node is our start position, i.e., it is our root, we're
    //done
    if( node == root_ )
      break;
  }

  // Map to show path
  cv::Mat map_color(map_.size().height, map_.size().width, CV_8UC3);
  cvtColor(map_, map_color, CV_GRAY2RGB);

  // Now go through the list and print all positions
  std::cout << "This is the path from "
            << root_->map_position_.label << " to "
            << goal_position.label << ":\n";
  std::cout << root_->map_position_.label;
  // Show them in the map to.
  map_color.at<cv::Vec3b>(root_->map_position_.row,
                          root_->map_position_.column) = cv::Vec3b(0,0,255);
  for( listIt = finalPath.begin(); listIt != finalPath.end(); listIt++)
  {
    std::cout << " --> " << listIt->label;
    map_color.at<cv::Vec3b>(listIt->row,listIt->column) = cv::Vec3b(0,0,255);
  }
  std::cout << std::endl;
  cv::imshow("Map", map_color);
  cv::imwrite("Map_solution.png", map_color);

}

E no output da aplicação aparecem-me todos os pontos, em (x,y), que precido de aceder.. o problema é que no ficheiro main.cpp não lhes consigo ter acesso. Ou consigo? Como? Não estou a conseguir.
 
Ou então.. há alguma maneira de fazer "return" do finalPath e depois aceder-lhe na função que pretendo?
Se sim, como?
 
Já me disseram que dá para passar o finalPath por parâmetro para a main, mas ninguém me conseguiu ajudar mais que isso. Peço desculpa por estar a insistir mas é um bocadinho urgente :(
 
Back
Topo