OpenCV последовательности - как создать последовательность пар точек? - PullRequest
29 голосов
/ 08 августа 2011

Я пытаюсь создать пустую последовательность (CvSeq) в OpenCV, похожую по структуре на структуру, возвращаемую, например, cvHoughLines2 (при использовании в CV_HOUGH_PROBABILISTIC) - последовательности пар точек.

Я нашел способ создать последовательность (не связанных) точек (надеюсь, это правильно для последовательности точек):

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

, но, глядя на флаги, доступные для созданияCvSeq Я не могу найти ничего, что я мог бы использовать для построения последовательности, элементами которой были бы пары точек.Я хотел бы получить доступ к элементам моей созданной последовательности таким же образом, как я получаю доступ к строкам, которые я получаю из преобразования Хафа:

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

    ...

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

    ...
}

Кроме того, как бы я вставил элементы в такую ​​последовательность?: /

Причина вопроса в том, что у меня уже есть довольно сложная функция, работающая с CvSeq строками, возвращенными функцией cvHoughLines2(), и я хотел бы использовать ее на некоторых произвольных строках.создаст на картинке (в целях тестирования и т. д.).Я искал ответ на аналогичный вопрос, но ничего не смог найти ...: (*

Большое спасибо всем за помощь!

РЕДАКТИРОВАТЬ: нашел решение.

Похоже, единственное, что нужно сделать, - это полностью опустить флаги, указывающие, что вы не будете использовать какой-либо из предопределенных типов (например, точек), и просто указать правильный размер последовательности.компонент:

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

Я могу добавить к хранилищу, передав указатель на двухточечный массив функции push:

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

Таким образом, я могу получить доступ кпоследовательность так же, как я получил доступ к выходу преобразования Хафа.

1 Ответ

8 голосов
/ 14 октября 2011

После 20 минут поиска решения, чтобы помочь, я прочитал весь вопрос и нашел решение для редактирования. Скопируйте и вставьте , чтобы вывести этот вопрос из без ответа .

Похоже, что единственное, что нужно сделать, это полностью опустить флаги , указывающие, что вы не будете использовать ни один из предопределенных типов (например, точек), и просто дать правильный размер компонент последовательности:

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

Можно добавить в хранилище, передав указатель на двухточечный массив функции push:

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

Таким образом, я могу получить доступ к последовательности так же, как и к выходу преобразования Хафа.

...