2012-02-13 2 views
0

이중 값 배열을 만들 때 CvSeq에 만든 배열을 추가하고 싶습니다. 이 목적을 위해 cvSeqPush를 사용했습니다. 그러나이 배열을 검색 할 때는 배열의 첫 번째 요소 만 표시되고 나머지는 가비지입니다. 다음과 같이 코드는 내가 CV_GET_SEQ_ELEM.Can의 사람이 문제가 어디 말해 사용하고 어디CvSeq에 배열을 추가하는 방법 및 배열을 검색하는 방법

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 

문제는 라인에서 발생 ..입니까 ??

답변

1

문제가있는 것을 CV_GET_SEQ_ELEM 한 번에 하나 개의 요소를 얻을, 당신은 당신이 cvCvtSeqToArray(s, arr, CV_WHOLE_SEQ);

같은 인수와 함께 기능 cvCvtSeqToArray를 호출 할 1.

의 인덱스를 전달하여 첫 번째 요소를 지정

이 함수에 대한 두 번째 매개 변수를 전달한 배열이 초기화되어야 함을 유의하십시오.

예 : CvPoint* arr = (CvPoint*)malloc(count*sizeof(CvPoint)); 여기서 count는 배열의 요소 수입니다.

CvSeq은 사용하려고하는 2 차원 배열과는 달리 확장 가능한 1 차원 배열을 나타내는 데 엄격하게 사용됩니다. cvMat이 아닌 다차원 배열을 계속 사용하려면 CvSeq의 CvSeq를 시도해 볼 수 있지만 여전히 같은 문제가 있다고 생각합니다.

따라서 CV_GET_SEQ_ELEM을 호출하면 사용자가 지정한 메모리의 단일 포인터 (배열의 첫 번째 요소) 만 깨끗하게 액세스합니다.

CvSeq의 std :: vector 또는 CvSeq 배열을 시도해 볼 수도 있지만 시도하지는 않았습니다.

+0

답장을 보내 주셔서 감사합니다. CV_GET_SEQ_ELEM에서 수정했습니다. 사실 배열의 각 요소에 1 바이트 3 차원의 배열 하나를 저장했습니다. 그리고 그 값을 업데이트 할 수 있도록 시퀀스에서 한 번에 하나의 배열을 검색하려고합니다. 배열을 검색하고 있지만 나머지 배열의 첫 번째 요소 만 가져오고 있습니다. 두 값은 가비지입니다. 왜 그렇게 ..? – ATG

+0

도움 주셔서 감사합니다 .. !!! – ATG

관련 문제