создать настраиваемую последовательность CvPoint в OpenCv - PullRequest
1 голос
/ 25 февраля 2012

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

IplImage*    g_gray    = NULL;

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


CvPoint points[4]; 
points[0].x = 10;
points[0].y = 10;
points[1].x = 1;
points[1].y = 1;
points[2].x = 20;
points[2].y = 50;
points[3].x = 10;
points[3].y = 10;

cvSeqPush(seq, &points); 

g_gray = cvCreateImage( cvSize(300,300), 8, 1 );

cvNamedWindow( "MyContour", CV_WINDOW_AUTOSIZE );

cvDrawContours( 
    g_gray, 
    seq, 
    cvScalarAll(100),
    cvScalarAll(255),
    0,
    3);

cvShowImage( "MyContour", g_gray );

cvWaitKey(0);  

cvReleaseImage( &g_gray );
cvDestroyWindow("MyContour");

return 0;

Из этого поста я выбрал способ создания настраиваемой последовательности контуров из CvPoint. Последовательности OpenCV - как создать последовательность пар точек?

Для второй попытки я сделал это с Cpp OpenCV:

vector<vector<Point2i>> contours;
Point2i P;
P.x = 0;
P.y = 0;
contours.push_back(P);
P.x = 50;
P.y = 10;
contours.push_back(P);
P.x = 20;
P.y = 100;
contours.push_back(P);

Mat img = imread(file, 1);
drawContours(img, contours, -1, CV_RGB(0,0,255), 5, 8);

Возможно, я неправильно использовал данные. Компилятор предупреждает об ошибках и не допускает точки push_back для таких векторов. Почему ??

Ошибка такая: Ошибка 2 ошибка C2664: 'std :: vector <_Ty> :: push_back': невозможно преобразовать параметр 1 из 'cv :: Point2i' в 'const std :: vector <_Ty> &'

Ответы [ 2 ]

1 голос
/ 04 апреля 2013

В первом примере вы создали последовательность из четырех точек с одним элементом. Последовательность elem_size должна быть sizeof(CvPoint) (не умножена на четыре) и добавлять очки один за другим:

CvMemStorage *memStorage = cvCreateMemStorage(0); 
// without these flags the drawContours() method does not consider the sequence
// as contour and just draws nothing
CvSeq* seq = cvCreateSeq(CV_32SC2 | CV_SEQ_KIND_CURVE, 
      sizeof(CvSeq), sizeof(CvPoint), memStorage); 

cvSeqPush(cvPoint(10, 10));
cvSeqPush(cvPoint(1, 1));
cvSeqPush(cvPoint(20, 50));

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

1 голос
/ 01 марта 2012

Я наконец-то закончил.

Mat g_gray_cpp = imread(file, 0);  

vector<vector<Point2i>> contours; 
vector<Point2i> pvect;
Point2i P(0,0);

pvect.push_back(P);

P.x = 50;
P.y = 10;   
pvect.push_back(P);

P.x = 20;
P.y = 100;
pvect.push_back(P);

contours.push_back(pvect);

Mat img = imread(file, 1);

drawContours(img, contours, -1, CV_RGB(0,0,255), 5, 8);

namedWindow( "Contours", 0 );
imshow( "Contours", img );  

, поскольку 'contours' - это вектор>, contours.push_back (var) -> var должен быть вектором

Спасибо!Я узнал ошибку

...