Как добавить массив в CvSeq, а также как получить массив - PullRequest
0 голосов
/ 13 февраля 2012

Я создаю массив двойных значений, я хочу добавить созданный массив в CvSeq. Я использовал cvSeqPush для этой цели. Но когда я получаю этот массив, он показывает только первый элемент массива, а остальное - мусор. Код выглядит следующим образом ..

int Ts = 45;
int count = 0;
//Creating a mtrix CL for clusters
CvMat * CL = cvCreateMat(1,newCP->cols,newCP->type);
//Array for storing the clusters
double * arrClust = (double*)malloc(3*sizeof(double));

//Copying 1st row of newCP to arrClust
arrClust[0] = cvmGet(newCP,0,0);
arrClust[1] = cvmGet(newCP,0,1);
arrClust[2] = cvmGet(newCP,0,2);

//array of distances
double * distance = (double*)malloc(1*sizeof(double));

//array of results
double * result = (double*)malloc(1*sizeof(double));

//Creating a seq to store various clusters
CvMemStorage * strgeClust = cvCreateMemStorage(0);
CvSeq * seqClust = cvCreateSeq(0,sizeof(CvSeq),sizeof(double),strgeClust);
CvSeq * s ;
for(int i=2 ; i<newCP->rows ; i++ )
{
    for(int j=0;j<=count;j++)
    {
        double a = arrClust[0] - cvmGet(newCP,i,0); //a = CL0-newCP0
        double b = arrClust[1] - cvmGet(newCP,i,1); //b = CL1-newCP1
        double c = arrClust[2] - cvmGet(newCP,i,2); //c = CL2-newCP2
        double sum = (a*a)+(b*b)+(c*c);             //(a^2 + b^2 + c^2)
        double sqrtSum = sqrt(sum);

        distance[j] = sqrtSum ;

        if(distance[j]<=Ts)
            result[j] = 0;
        else
            result[j] = 1;
    }
    //Checking for zero in result array 
    int isZero = 1;
    for(int k =0;k<=count;k++)
    {
        if(result[k] == 0)
        {
            isZero =0;
            break;
        }
    }
    if(isZero!=0)
    {
        count = count+1;
        cvSeqPush(seqClust,arrClust);
        arrClust = (double*)malloc(3*sizeof(double));
        arrClust[0] = cvmGet(newCP,i,0);
        arrClust[1] = cvmGet(newCP,i,1);
        arrClust[2] = cvmGet(newCP,i,2);

    }
    else
    {
        double minElement = fnSortForMin(distance,count+1); //Getting the minimum value from distance array
        int index = fnSearchIndexOfMin(distance,minElement,count+1); //Getting the index of minElement
        if(index == count)
        {
            arrClust[0] = (arrClust[0]+cvmGet(newCP,i,0))/2;
            arrClust[1] = (arrClust[1]+cvmGet(newCP,i,1))/2;
            arrClust[2] = (arrClust[2]+cvmGet(newCP,i,2))/2;
        }
        else
        {
            s = seqClust;
            for(int i = 1;i<index;i++)
            {
                s = seqClust->h_next; 
            }
            double * arr = CV_GET_SEQ_ELEM(double,s,index);
            arr[0] = (arr[0]+cvmGet(newCP,i,0))/2;
            arr[1] = (arr[1]+cvmGet(newCP,i,1))/2;
            arr[2] = (arr[2]+cvmGet(newCP,i,2))/2;
        }
    }//End of outer If Block        
}//End Of outer For loop

Проблема возникает в строке, где я использую CV_GET_SEQ_ELEM. Может кто-нибудь сказать мне, где проблема ??

1 Ответ

1 голос
/ 13 февраля 2012

Проблема в том, что CV_GET_SEQ_ELEM получает только один элемент за раз, и вы указали только первый элемент, передав индекс 1. 1. 1002 *

Вы хотите вызвать функцию cvCvtSeqToArray саргументы типа cvCvtSeqToArray(s, arr, CV_WHOLE_SEQ);

Обратите внимание, что массив arr, передавший второй параметр этой функции, должен быть инициализирован

Например, CvPoint* arr = (CvPoint*)malloc( count*sizeof(CvPoint));, где count - это количество элементов в массиве.

CvSeq строго используется для представления растущих 1d-массивов, в отличие от 2d-массива, который вы пытаетесь использовать.Если вы хотите продолжать использовать многомерные массивы, которые не являются cvMat, вы можете попробовать CvSeq из CvSeq, но я все еще думаю, что у вас возникнет та же проблема.

Следовательно, вызов CV_GET_SEQ_ELEM только чисто обращается к единственному указателю в памяти, которыйдайте его, который является первым элементом массива.

Вы также можете попробовать std :: vector CvSeq или массив CvSeq, но я этого не пробовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...