CV

    技术2022-05-20  49

     

     

     

     

     

     

    #include "cv.h" #include "highgui.h" #include <stdio.h> void PrintMat(CvMat *A); // 显示矩阵 void Test_Multiply(); // 测试矩阵乘法 int main() { Test_Multiply(); // pass // Test_cvGetRawData(); // pass // Test_DCT(); //pass // Test_Rand(); // pass // Test_SeqSort(); // pass return 0; } // 显示矩阵 void PrintMat(CvMat* A) { int i,j; //printf("/nMatrix = :"); for(i=0;i<A->rows;i++) { printf("/n"); switch( CV_MAT_DEPTH(A->type) ) { case CV_32F: case CV_64F: for(j=0;j<A->cols;j++) printf("%9.3f ", (float) cvGetReal2D( A, i, j )); break; case CV_8U: case CV_16U: for(j=0;j<A->cols;j++) printf("m",(int)cvGetReal2D( A, i, j )); break; default: break; } } printf("/n"); } void Test_Multiply() { double a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; double b[] = { 1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12 }; double c[9]; CvMat Ma, Mb, Mc; printf("/n=== Test multiply ==="); cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a, CV_AUTOSTEP ); cvInitMatHeader( &Mb, 4, 3, CV_64FC1, b, CV_AUTOSTEP ); cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c, CV_AUTOSTEP ); cvMatMulAdd( &Ma, &Mb, 0, &Mc ); PrintMat(&Ma); PrintMat(&Mb); PrintMat(&Mc); return; }

     

    如果把程序中的的这一段中的数据类型CV_64FC1改成CV_32FC1,结果和CV_64FC1的不同

    cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a, CV_AUTOSTEP ); cvInitMatHeader( &Mb, 4, 3, CV_64FC1, b, CV_AUTOSTEP ); cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c, CV_AUTOSTEP );

     

    修改的

     

    cvInitMatHeader( &Ma, 3, 4, CV_32FC1, a, CV_AUTOSTEP ); cvInitMatHeader( &Mb, 4, 3, CV_32FC1, b, CV_AUTOSTEP ); cvInitMatHeader( &Mc, 3, 3, CV_32FC1, c, CV_AUTOSTEP );

     

    原因是什么了?

    CV_32FC1和CV_64FC1,前者是32位数据,后者是64位数据。因此前者类型的数据必须以指向32位数据类型的指针存取,否则会报错,而后者类型的数据必须以指向64位数据类型的指针存取,否则会报错。也就是说,你如果用cv_32fc1,那么后面对该矩阵的输入输出的数据指针类型都应该是float,这在32位编译器上是32位浮点数,也就是单精度。你如果用cv_64fc1,那么后面对该矩阵的输入输出的数据指针类型都应该是double,这在32位编译器上是64位浮点数,也就是双精度。

     

    而程序之前将数据给CVMAT的时候,是这样的一段代码?

     

    double a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; double b[] = { 1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12 }; double c[9];

     

    将其中的double改成float就可以了

    float a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; float b[] = { 1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12 }; float c[9];

     

     

     

     


    最新回复(0)