10
votes

Dessiner des polygones dans OpenCV?

Qu'est-ce que je fais mal ici?

error: cannot convert 'std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > >' to 'const cv::Point*' in initialization


0 commentaires

4 Réponses :


3
votes

ContourLement est le vecteur de vecteur et pas le point :) Donc, au lieu de: xxx

mettre xxx


1 commentaires

Merci. Mais pour la fonction, l'argument doit être un point de consct non pas un vecteur de points de const.



16
votes

Analysez la ligne incriminée:

fillPoly (contourMask, elementPoints, &numberOfPoints, 1, Scalar (0, 0, 0), 8);


6 commentaires

Merci. Cependant, sur la ligne qui indique "Const Point * ElementPoints [1] = {TMP [0]};" Je reçois l'erreur de dire "Erreur: impossible de convertir 'CV :: Pointe_ ' to 'const CV :: Pointe *" dans l'initialisation ". Une idée pourquoi?


Ouais, j'ai oublié d'ajouter un & . Mise à jour de la réponse, veuillez le tester maintenant.


Merci. Il compile correctement, mais j'ai une question. Ne soyez-vous pas juste en avant un point singulier? Vous n'avez pas besoin de passer tous les points pour dessiner tout le polygone?


Vous dirigez vers le tout premier élément du vecteur, cependant Nombre de points définit le nombre d'éléments là-bas après cela. ;)


Dis, si j'ai 4 coordonnées, (x1, y1), (x2, y2), (x3, y3) et (x4, y4) comment puis-je écrire ceci sous forme de vecteur?? S'il vous plaît aider. !!!


@ karlphillip- je suis masquage image à l'aide de FillPoly.mais c'est givrng Me masque pour point (0,0) aussi.Qui n'est pas nécessaire.Tout pourquoi je reçois cela?



20
votes

juste pour l'enregistrement (et parce que le docu OpenCV est très rare ici) un extrait plus réduit à l'aide de l'API C ++:

  std::vector<cv::Point> fillContSingle;
  [...]
  //add all points of the contour to the vector
  fillContSingle.push_back(cv::Point(x_coord,y_coord));
  [...]

  std::vector<std::vector<cv::Point> > fillContAll;
  //fill the single contour 
  //(one could add multiple other similar contours to the vector)
  fillContAll.push_back(fillContSingle);
  cv::fillPoly( image, fillContAll, cv::Scalar(128));


4 commentaires

AFAIK Cet appel de C ++ de FillPoly n'est documenté nulle part, mais c'est le moyen le plus facile et le plus intuitif de dessiner des polygones remplis!


Double >> Dans STD imbriquée :: Les vecteurs ne fonctionnent pas pour GCC. J'ai essayé d'ajouter un espace à la réponse, mais il nécessite un minimum de 6 caractères par modification.


@ LAHJATON_J; Thxs, j'ai ajouté un blanc


Joli! Je me demandais pourquoi il n'y avait pas de documentation sur cette façon de le faire. En outre, dans ce cas de contour unique, vous pouvez l'envelopper dans l'appel: FILLPOLY (image, vecteur > {FillContsingle}, couleur)



1
votes

Certaines personnes peuvent arriver ici en raison d'un bogue apparemment dans les échantillons / cpp / create_mask.cpp de l'OpenCV. De cette façon, compte tenu de l'explication ci-dessus, j'ai édité la succursale "SI (Event == Event_RButtonup)" Direction para à:

    ...
    mask = Mat::zeros(src.size(), CV_8UC1);
    vector<Point> tmp = pts;
    const Point* elementPoints[1] = { &tmp[0] };        
    
    int npts = (int) pts.size();        
    
    cout << "elementsPoints=" << elementPoints << endl;

    fillPoly(mask, elementPoints, &npts, 1, Scalar(255, 255, 255), 8);     
    bitwise_and(src, src, final, mask);
    ...


0 commentaires