29 votes

Séquences OpenCV - comment créer une séquence de paires de points?

Je suis en train de créer une séquence vide (CvSeq) en OpenCV d'une structure semblable à celui retourné par, par exemple, cvHoughLines2 (lorsqu'il est utilisé en CV_HOUGH_PROBABILISTIC) - une séquence de point de paires.

J'ai trouvé un moyen de rendre une séquence de (non connectées) points (j'espère que c'est correct pour un point de la séquence):

CvMemStorage *memStorage = cvCreateMemStorage(0);
CvSeq* seq = cvCreateSeq(
             CV_SEQ_FLAG_SIMPLE | CV_SEQ_KIND_SET | CV_SEQ_ELTYPE_POINT,
             sizeof(CvSeq), sizeof(CvPoint), memStorage); 

mais en regardant les indicateurs disponibles pour la création d' CvSeq je ne peux pas trouver quelque chose que je pourrais utiliser pour construire une séquence dont les éléments seraient point paires. Je voudrais avoir accès aux éléments de ma séquence créée de la même manière ai-je accès à des lignes que je reçois de la Transformation de Hough:

for (int i=0; i < mylines->total; ++i){
    CvPoint *line = (CvPoint *)cvGetSeqElem(mylines, i);

    ...

    ... line[0].x ...
    ... line[1].y ... 

    ...
}

Aussi, comment puis-je insérer des éléments dans une séquence de ce type? :/

La raison de la question est que j'ai déjà assez complexe de la fonction d'exploitation sur un CvSeq de lignes retournées par un cvHoughLines2() de la fonction, et je voudrais l'utiliser sur certains arbitraire lignes je voudrais créer dans l'image (à des fins de test, etc...). J'ai regardé partout pour une réponse à une question similaire, mais ne pouvait pas trouver quoi que ce soit... :(

Merci beaucoup à tous pour votre aide!

EDIT: trouvé la solution.

Regarde comme la seule chose qui doit être fait est d'omettre les drapeaux complètement, indiquant que vous ne serez pas en utilisant l'un des types prédéfinis (e.g points), et de donner juste la bonne taille de la séquence composant:

CvMemStorage *memStorage = cvCreateMemStorage(0);
CvSeq* seq = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvPoint)*2, memStorage);

Je peux qu'ajouter à l'espace de stockage en passant le pointeur de 2 points de tableau à l' push fonction de:

CvPoint points[2];
... (initialize the points) ...
cvSeqPush(seq, &points);

De cette façon, je peux accéder à la séquence de la même façon que j'ai accédé à la sortie de la Transformation de Hough.

8voto

robermorales Points 1267

Après 20 minutes à chercher une solution afin de les aider, j'ai lu l'ensemble de la question et a trouvé une solution à modifier. Copier et coller, afin d'obtenir cette question sans réponse.

Regarde comme la seule chose qui doit être fait est d'omettre les drapeaux complètement, indiquant que vous ne serez pas en utilisant l'un des types prédéfinis (e.g points), et de donner juste la bonne taille de la séquence composant:

CvMemStorage *memStorage = cvCreateMemStorage(0);
CvSeq* seq = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvPoint)*2, memStorage);

Je peux qu'ajouter à l'espace de stockage en passant le pointeur de 2 points de tableau à la fonction "push":

CvPoint points[2];
... (initialize the points) ...
cvSeqPush(seq, &points);

De cette façon, je peux accéder à la séquence de la même façon que j'ai accédé à la sortie de la Transformation de Hough.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X