gpt4 book ai didi

c++ - 如何将数组添加到 CvSeq 以及如何检索数组

转载 作者:行者123 更新时间:2023-11-28 08:10:25 24 4
gpt4 key购买 nike

我正在创建一个 double 值数组,我想将创建的数组添加到 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 的那一行。有人能告诉我问题出在哪里吗??

最佳答案

问题是 CV_GET_SEQ_ELEM 一次只能获取一个元素,而您只通过传入索引 1 指定了第一个元素。

你想调用函数 cvCvtSeqToArray 参数如下cvCvtSeqToArray(s, arr, CV_WHOLE_SEQ);

请注意,传递给此函数的第二个参数的数组 arr 需要初始化

例如CvPoint* arr = (CvPoint*)malloc( count*sizeof(CvPoint)); 其中 count 是数组中元素的数量。

CvSeq 严格用于表示可增长的一维数组,而不是您尝试使用的二维数组。如果您想继续使用不是 cvMat 的多维数组,您可以尝试 CvSeq 的 CvSeq,但我仍然认为您会遇到同样的问题。

因此调用 CV_GET_SEQ_ELEM 只会干净地访问内存中您给它的单个指针,它是数组的第一个元素。

您也可以尝试 CvSeq 的 std::vector 或 CvSeq 数组,但我还没有尝试过。

关于c++ - 如何将数组添加到 CvSeq 以及如何检索数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9256363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com