Как сделать массив CvPoint или CvSeq, содержащий массив CvPoint? - PullRequest
0 голосов
/ 06 декабря 2011

Я новичок как в opencv, так и в c ++, и я читал аналогичный вопрос о массиве cvpoint, но не могу заставить его работать.Это мой код, я пытаюсь выделить CvPoint для массива CvPoint и CvPoint для CvSeq:

.................
CvMemStorage* storage = cvCreateMemStorage(0);
CvMemStorage* storage1 = cvCreateMemStorage(0);
CvSeq* lines = 0;
CvSeq* coor = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvPoint)*2, storage1);
lines = cvHoughLines2(roiblob, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 20, 10, 5);
ncoor = 0;
CvPoint centers;
CvPoint pt[2];
CvPoint *centerlist = new CvPoint [lines->total];
for(int i = 0; i < lines->total; i++ ) {
    CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
    pt[0] = line[0];
    pt[1] = line[1];
    pt[0] = cvPoint(pt[0].x + pointawal.x, pt[0].y + pointawal.y);
    pt[1] = cvPoint(pt[1].x + pointawal.x, pt[1].y + pointawal.y);
    double theta = atan((double)(pt[1].y - pt[0].y)/(pt[1].x - pt[0].x));       
    if (cos(theta) > 0.996) {                   
    centers = cvPoint(pt[0].x + (pt[1].x - pt[0].x)/2, pt[0].y + (pt[1].y - pt[0].y)/2);
        cvSeqPush(coor,&pt);                         // here the 1st problem
        centerlist[ncoor] = centers;                 // here the 2nd problem 

здесь я получил правильное значение центров, например: 128

    cout << centerlist[ncoor].x << "\n";
    ncoor++;
    }

здесь я получилнеправильное значение (отрицательное значение с тем же значением для каждой итерации, например: -85415)

cout << centerlist[ncoor].x << "\n";
} 

, и я думаю, что проблема в 1 и 2

Ответы [ 2 ]

0 голосов
/ 11 июня 2012

Проблема здесь:

CvPoint *centerlist = new CvPoint [lines->total];

Вы создаете ссылки, но вам все еще нужно создать объект для каждой ссылки.

centerlist[ncoor] = CvPoint(centers);
0 голосов
/ 06 декабря 2011

Наконец, после поиска везде, я получил ответ, я использую malloc и realloc для замены нового, и я все еще не понимаю, как использовать CvSeq, поэтому я тоже заменяю его. Вот мой новый код:

................
CvPoint *centerlist,*coor1,*coor2*,tempcenterlist,*tempcoor1,*tempcoor2;
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* lines = 0;       
lines = cvHoughLines2(roiblob, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 20, 10, 5);
centerlist = (CvPoint*)malloc(sizeof(CvPoint));    // use malloc here to replace new
coor1 = (CvPoint*)malloc(sizeof(CvPoint));
coor2 = (CvPoint*)malloc(sizeof(CvPoint));
CvPoint pt0,pt1,centers;
ncoor = 0;
for(int i = 0; i<lines->total; i++ ) {
    CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
    pt0 = line[0];
    pt1 = line[1];
    pt0 = cvPoint(pt0.x + pointawal.x, pt0.y + pointawal.y);
    pt1 = cvPoint(pt1.x + pointawal.x, pt1.y + pointawal.y);
    double theta = atan((double)(pt1.y - pt0.y)/(pt1.x - pt0.x));
    if (cos(theta) > 0.996) {
        centers = cvPoint(pt0.x + (pt1.x - pt0.x)/2, pt0.y + (pt1.y - pt0.y)/2);
        centerlist[ncoor] = centers;
        coor1[ncoor] = pt0;
        coor2[ncoor] = pt1;
        //use realloc here
        tempcenterlist = (CvPoint*)realloc(centerlist,(i+2)*sizeof(CvPoint)); 
        tempcoor1 = (CvPoint*)realloc(coor1,(i+2)*sizeof(CvPoint));
        tempcoor2 = (CvPoint*)realloc(coor2,(i+2)*sizeof(CvPoint));
        if (tempcenterlist != NULL ) centerlist = tempcenterlist;
        if (tempcoor1 != NULL )  coor1 = tempcoor1;
        if (tempcoor2 != NULL )  coor2 = tempcoor2;
        else {
            free(centerlist);
            free(coor1);
            free(coor2);
            printf("Error allocating memory!\n");
        }    
    ncoor++;
    }       
}
// check the array value
if (ncoor > 0)  cout << centerlist[0].x << centerlist[0].y << "\n";

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

...