Подтвердить что ты не робот

Последовательности OpenCV - как создать последовательность пар точек?

Я пытаюсь создать пустую последовательность (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, я не могу найти ничего, что мог бы использовать для построения последовательности, чьи элементы были бы точками. Я хотел бы получить доступ к элементам моей созданной последовательности так же, как я получаю доступ к строкам, которые я получаю из преобразования Hough:

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

    ...

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

    ...
}

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

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

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

EDIT: найдено решение.

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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