您的位置:首页 > 其它

单一矩阵的运算

2012-04-26 09:10 169 查看
//运行参数:girl.jpg 
#pragma comment(lib,"highgui.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"ml.lib")
#pragma comment(lib,"cvaux.lib")
#pragma comment(lib,"cvcam.lib") 

#include "cv.h"
#include "highgui.h"
#include <stdio.h>

inline void cvDoubleMatPrint( const CvMat* mat );
inline void cvDoubleMatSet(  CvMat* mat,double v );
inline void cvDoubleMatSet( CvMat* mat);
inline void cvScalarPrint(const CvScalar& s);

int main( int argc, char** argv )
{
 IplImage* pImg; //声明IplImage指针

 if( argc == 2 && (pImg = cvLoadImage( argv[1], CV_LOAD_IMAGE_UNCHANGED)) != 0 )
 {

	// 单一矩阵的运算:
	CvMat *Ma, *Mb;
	Ma=cvCreateMat(4,4,CV_32FC1);
	Mb=cvCreateMat(4,4,CV_32FC1);
	//cvDoubleMatSet(Ma);
	cvSetIdentity(Ma);

	cvTranspose(Ma, Mb);      // 转置:transpose(Ma) -> Mb (注意转置阵不能返回给Ma本身)
	cvDoubleMatPrint(Ma);
	printf("转置后=====================\n");
	cvDoubleMatPrint(Mb);

	printf("迹:=====================\n");
	CvScalar t = cvTrace(Ma); // 迹:trace(Ma) -> t.val[0]
	cvScalarPrint(t);

	double d = cvDet(Ma);     // 行列式:det(Ma) -> d
	printf("行列式:%lf=====================\n",d);

	cvInvert(Ma, Mb);         // 逆矩阵:inv(Ma) -> Mb
	printf("逆矩阵=====================\n");
	cvDoubleMatPrint(Mb);

  cvNamedWindow( "Image", 1 ); // 创建窗口
  cvShowImage( "Image", pImg ); // 显示图像
  cvWaitKey(0);     // 等待按键

  cvReleaseMat(&Ma);  
  cvReleaseMat(&Mb);  

  cvDestroyWindow( "Image" );  // 销毁窗口
  cvReleaseImage( &pImg );  // 释放图像

  return 0;
 }

 return -1;
}

inline void cvDoubleMatPrint( const CvMat* mat )
{
    int i, j;
    for( i = 0; i < mat->rows; i++ )
    {
        for( j = 0; j < mat->cols; j++ )
        {
            printf( "%lf ",cvmGet( mat, i, j ) );
        }
        printf( "\n" );
    }
}

inline void cvDoubleMatSet( CvMat* mat,double v )
{
    int i, j;
    for( i = 0; i < mat->rows; i++ )
    {
        for( j = 0; j < mat->cols; j++ )
        {
            cvmSet( mat,i,j,v);
        }
        
    }
}

inline void cvDoubleMatSet( CvMat* mat)
{
    int i, j;
	double v;
    for( i = 0; i < mat->rows; i++ )
    {
        for( j = 0; j < mat->cols; j++ )
        {
			v=i*10+j;
            cvmSet( mat,i,j,v);
        }
        
    }
}

inline void cvScalarPrint(const CvScalar& s)
{
	printf("\n%f %f %f %f\n",s.val[0],s.val[1],s.val[2],s.val[3]);
//CvScalar t = cvTrace(Ma); // 迹:trace(Ma) -> t.val[0]
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: