OpenCV矩阵运算用例

来源:互联网 发布:罗素兰挂号 知乎 编辑:程序博客网 时间:2024/04/30 10:35
//-----------------------------------------------------------------
/**
\brief    测试OpenCV的矩阵运算
\return
*/
//-----------------------------------------------------------------
void TestOpenCVMat()
{
float arrFirstMat[9] =
{
1, 2, 3,
4, 5, 6,
7, 8, 9
};


float arrSecondMat[9] =
{
2, 2, 2,
2, 2, 2,
2, 2, 2
};


float arrDstMat[9] =
{0};


uchar arrMaskMat[9] =
{
1, 1, 1,
0, 0, 0,
0, 0, 0
};


CvMat stFirstMat;
CvMat stSecondMat;
CvMat stDstMat;
CvMat stMaskMat;
cvInitMatHeader(&stFirstMat, 3, 3, CV_32FC1, arrFirstMat);
cvInitMatHeader(&stSecondMat, 3, 3, CV_32FC1, arrSecondMat);
cvInitMatHeader(&stMaskMat, 3, 3, CV_8UC1, arrMaskMat);
cvInitMatHeader(&stDstMat, 3, 3, CV_32FC1, arrDstMat);

cout << cv::Mat(&stFirstMat) << endl<<endl;
cout << cv::Mat(&stSecondMat) << endl<<endl;
cout << cv::Mat(&stMaskMat) << endl<<endl;
cout << cv::Mat(&stDstMat) << endl << endl;


cvZero(&stDstMat);
cvAdd(&stFirstMat, &stSecondMat, &stDstMat);
cout <<"cvAdd(&stFirstMat, &stSecondMat, &stDstMat);\n" <<cv::Mat(&stDstMat) << endl;


cvZero(&stDstMat);
cvAdd(&stFirstMat, &stSecondMat, &stDstMat, &stMaskMat);
cout << "cvAdd(&stFirstMat, &stSecondMat, &stDstMat, &stMaskMat);\n" << cv::Mat(&stDstMat) << endl;


cvZero(&stDstMat);
cvAddS(&stFirstMat, cvScalar(3), &stDstMat);
cout << "cvAddS(&stFirstMat, cvScalar(3), &stDstMat);\n" << cv::Mat(&stDstMat) << endl;


cvZero(&stDstMat);
cvAddWeighted(&stFirstMat, 2.0, &stSecondMat, 3.0, 4.0, &stDstMat);
cout << "cvAddWeighted(&stFirstMat, 2.0, &stSecondMat, 3.0, 4.0, &stDstMat);\n" << cv::Mat(&stDstMat) << endl;


//矩阵点乘
cvZero(&stDstMat);
cvMul(&stFirstMat, &stSecondMat, &stDstMat);
cout << "cvMul(&stFirstMat, &stSecondMat, &stDstMat);\n" << cv::Mat(&stDstMat) << endl;


//矩阵点乘
cvZero(&stDstMat);
cvMul(&stFirstMat, &stSecondMat, &stDstMat, 1.5);
cout << "cvMul(&stFirstMat, &stSecondMat, &stDstMat, 1.5);\n" << cv::Mat(&stDstMat) << endl;


//矩阵乘法
cvZero(&stDstMat);
cvMatMul(&stFirstMat, &stSecondMat, &stDstMat);
cout << "cvMatMul(&stFirstMat, &stSecondMat, &stDstMat);\n" << cv::Mat(&stDstMat) << endl;


//矩阵乘法
cvZero(&stDstMat);
cvMatMulAdd(&stFirstMat, &stSecondMat, &stSecondMat, &stDstMat);
cout << "cvMatMulAdd(&stFirstMat, &stSecondMat, &stSecondMat, &stDstMat);\n" << cv::Mat(&stDstMat) << endl;


//向量点乘
cvZero(&stDstMat);
double dValue = cvDotProduct(&stFirstMat, &stSecondMat);
cout << "cvDotProduct(&stFirstMat, &stSecondMat);\n" << dValue << endl;


//叉乘
float arrX[3] = { 1, 0, 0 };
float arrY[3] = { 0, 1, 0 };
float arrZ[3] = { 0, 0, 0 };


CvMat stX = cvMat(3, 1, CV_32FC1, arrX);
CvMat stY = cvMat(3, 1, CV_32FC1, arrY);
CvMat stZ = cvMat(3, 1, CV_32FC1, arrZ);


cvCrossProduct(&stX, &stY, &stZ);
cout << "cvCrossProduct(&stX, &stY, pZ);\n" << cv::Mat(&stZ) << endl;


//矩阵除法
cvZero(&stDstMat);


float arrDeno[9] =
{
2, 0, 0,
0, 2, 0,
0, 0, 2
};
CvMat stDeno;
cvInitMatHeader(&stDeno, 3, 3, CV_32FC1, arrDeno);


cvDiv(&stFirstMat, &stDeno, &stDstMat);
cout << "cvDiv(&stFirstMat, &stDeno, &stDstMat);\n" << cv::Mat(&stDstMat) << endl;


//矩阵转换
cv::Mat objNewMat(3, 3, CV_8UC1);
cv::Mat(&stDstMat).convertTo(objNewMat, CV_8UC1);
cout << "cv::Mat(&stDstMat).convertTo(objNewMat, CV_8UC1);\n" << objNewMat << endl;


//矩阵各通道求和
CvScalar stData = cvSum(&stFirstMat);
cout << "cvSum(&stFirstMat)\n" <<cv::Scalar(stData) << endl;


//矩阵求Log
cvLog(&stFirstMat, &stDstMat);
cout << "cvLog(&stFirstMat, &stDstMat);\n" << cv::Mat(&stDstMat) << endl;


//矩阵求e的指数
cvExp(&stFirstMat, &stDstMat);
cout << "cvExp(&stFirstMat, &stDstMat);\n" << cv::Mat(&stDstMat) << endl;


//矩阵转制
cvTranspose(&stFirstMat, &stDstMat);
cout << "cvTranspose(&stFirstMat, &stDstMat);\n" << cv::Mat(&stDstMat) << endl;


//矩阵求逆
cvInv(&stDeno, &stDstMat);
cout << "cvInv(&stDeno, &stDstMat);\n" << cv::Mat(&stDstMat) << endl;


//矩阵求绝对值
cvScale(&stFirstMat, &stFirstMat, -1.0);
cout << "stFirstMat = " << cv::Mat(&stFirstMat) << endl;


cvAbs(&stFirstMat, &stFirstMat);
cout << "cvAbs(&stFirstMat, &stDstMat);\n" << cv::Mat(&stFirstMat) << endl;


//对角矩阵、零矩阵、全一矩阵
float arrDiag[3] = { 0 };
CvMat stDiagMat = cvMat(1, 3, CV_32FC1, arrDiag);
cvGetDiag(&stFirstMat, &stDiagMat);
cout << "cvGetDiag(&stFirstMat, &stDiagMat);\n" << cv::Mat(&stDiagMat) << endl;


//测试统计功能
float arrResult[3] = { 0, 0, 0 };
CvMat stResult = cvMat(1, 3, CV_32FC1, arrResult);
cvReduce(&stFirstMat, &stResult, 0, CV_REDUCE_SUM);
cout << "cvReduce(&stFirstMat, &stResult, 0, CV_REDUCE_SUM);\n" << cv::Mat(&stResult) << endl;


cvReduce(&stFirstMat, &stResult, 0, CV_REDUCE_MAX);
cout << "cvReduce(&stFirstMat, &stResult, 0, CV_REDUCE_MAX);\n" << cv::Mat(&stResult) << endl;


}
0 0
原创粉丝点击