今天在看<<学习openCV>>的时候,看到"cvAbs,cvAbsDiff和.."这里的时候,发现一个问题,书上面写的函数的原型是:
void cvAbs( const CvArr* src, const dst );
本来以为这个函数是求数组的绝对值是指的是行列式,后来程序试验不是,而是和传入数组一样结构的数组。试验程序如下:
#include <cv.h> #include <highgui.h> #include <cxcore.h> #include <iostream> using namespace std; int main( int argc, char** argv ){ CvMat *mat; mat=cvCreateMat(3,4,CV_64FC1); float value = 0.0; int i = 0, j = 0; cout<<"初始化原始数组"<<endl; for ( i = 0; i < 3; i ++ ){ for( j = 0; j < 4; j ++ ){ value -= 4.0; CV_MAT_ELEM( *mat, float, i, j) = value; } } cout<<"赋值后"<<endl; for ( i = 0; i < 3; i ++ ){ for( j = 0; j < 4; j ++ ){ cout<<"/t"<<CV_MAT_ELEM( *mat, float, i, j); } cout<<endl; } CvMat *matDes; matDes=cvCreateMat(3,4,CV_64FC1); cout<<"目标矩阵"<<endl; for ( i = 0; i < 3; i ++ ){ for( j = 0; j < 4; j ++ ){ cout<<"/t"<<CV_MAT_ELEM( *matDes, float, i, j); } cout<<endl; } cvAbs( mat, matDes ); cout<<"数组的绝对值"<<endl; for ( i = 0; i < 3; i ++ ){ for( j = 0; j < 4; j ++ ){ cout<<"/t"<<CV_MAT_ELEM( *matDes, float, i, j); } cout<<endl; } cvAbsDiff( mat, cvCreateMat(3,4,CV_64FC1), matDes ); cout<<"两个差的绝对值"<<endl; for ( i = 0; i < 3; i ++ ){ for( j = 0; j < 4; j ++ ){ cout<<"/t"<<CV_MAT_ELEM( *matDes, float, i, j); } cout<<endl; } cvReleaseMat( &mat ); cvReleaseMat( &matDes ); return 0; }
结果如下:
初始化原始数组 赋值后 -4 -8 -12 -16 -20 -24 -28 -32 -36 -40 -44 -48 目标矩阵 0 0 0 0 0 0 0 0 0 0 0 0 数组的绝对值 -4 8 -12 16 -20 24 -28 32 -36 40 -44 48 两个差的绝对值 -4 8 -12 16 -20 24 -28 32 -36 40 -44 48 Press any key to continue
只是还有一点不大明白,这个cvAbs显然是要将矩阵所有的元素变成绝对值,但为何只变了两列,希望以后找到答案.