最初用opencv的cvNorm函數,發現結果錯的一塌糊塗! 多方查找沒有cvNorm太多的介紹,後來仔細查閱,從cvNorm等價於Matlab的norm函數出發尋找線索,而顯然matlab里norm函數不同與diff函數,無奈自己封裝吧。
CvMat* DiffMat(CvMat *B) //求向量B的一階差分 功能等價matlab里的diff
{
int cols = B->cols;
CvMat*Out = cvCreateMat(1, cols-1, B->type);
const float*pB = (const float*)(B->data.ptr);
float*pOut = ( float*)(Out->data.ptr);
for(int i=0; i
{
*pOut = *(pB+1)-*pB;
pB++;
pOut++;
}
return Out;
}
注意:1,輸入B是個向量,且為行向量
2,返回的是一個CvMat
3,數據類型默認的是float,在申請指針時用到了。
調用示例如下:
CvMat *diffMat = cvCreateMat(1,InMat->cols-1, InMat->type);
diffMat = DiffMat(InMat);
另附,打印一個CvMat數據的函數封裝,調用該函數可以方便查看矩陣中的元素。
void PrintMat(CvMat* A)
{
int i,j;
//printf("/nMatrix = :");
for(i=0;irows;i++) //行
{
printf("/n");
switch( CV_MAT_DEPTH(A->type) )
{
case CV_32F:
case CV_64F:
for(j=0;jcols;j++) //列
//獲取2維數組的元素
printf("%9.3f ", (float) cvGetReal2D( A, i, j ));
break;
case CV_8U:
case CV_16U:
for(j=0;jcols;j++)
printf("%6d",(int)cvGetReal2D( A, i, j ));
break;
default:
break;
}
}
printf("/n");
}