簡單介紹
本篇承接上一篇。繼續opencv下矩陣計算的函數使用。
計算矩陣的逆
注意:矩陣A是可逆矩陣的充分必要條件是行列式detA不等於0。
詳細代碼
double x[3][3] = {{1, 2, 3}, {2, 2, 1}, {3, 4, 3}}; double y[3][3] = {{1, 0, 0}, {0, 2, 0}, {0, 0, 3}}; void showMatdate(Mat tmpMat){ int i, j; CvScalar s1; Width = tmpMat.rows; Height = tmpMat.cols; IplImage tmp; tmp = tmpMat; for(i=0; i< Width; i++){ for(j=0; j<Height; j++){ s1 = cvGet2D(&tmp, i, j); printf("%0.1lf ", s1.val[0]); } printf("\n"); } printf("\n"); } int main(int argc, char *argv[]){ /*************初始化矩陣*****************************/ mat1 = Mat(3, 3, CV_64FC1, x); src1 = mat1; mat2 = Mat(3, 3, CV_64FC1, y); src2 = mat2; /*************顯示矩陣數據***************************/ printf("mat1:\n"); showMatdate(mat1); /*****************矩陣的逆**********************/ mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvInvert(&src1, &src3); showMatdate(mat3); return 0; }
結果顯示
矩陣元素自然對數
詳細代碼
/*****************矩陣元素自然對數**********************/ mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvLog(&src1, &src3); showMatdate(mat3);
結果顯示
矩陣查找表轉換
詳細代碼
/*****************矩陣查找表轉換**×******************/ uchar lut[256]; mat3 = Mat(3, 3, CV_8UC1); src3 = mat3; mat1.convertTo(mat1, CV_8UC1); src1 = mat1; mat2 = cvCreateMatHeader(1, 256, CV_8UC1); src2 = mat2; for (int i = 0; i < 256; i++) { lut[i] = 255 - i; } cvSetData(&src2, lut, 0); cvLUT(&src1, &src3, &src2); printf("cvLUT(mat1):\n"); showMatdate(mat3);
注意:mat3 = src2[mat1].(假設mat1格式為CV_8U) mat3 = src2[mat1 + 128].(假設mat1格式為CV_8S)
結果顯示
計算向量間馬氏距離
詳細代碼
/*************顯示矩陣數據***************************/ printf("mat1:\n"); showMatdate(mat1); printf("mat2:\n"); showMatdate(mat2); /*****************計算向量間馬氏距離**********************/ mat3 = Mat(3, 3, CV_64FC1, z); src3 = mat3; printf("mat3:\n"); showMatdate(mat3); tmp = cvMahalanobis(&src1, &src2, &src3); printf("cvMahalanobis(mat1, mat2, mat3): %.1lf\n", tmp);
馬氏距離的定義。參考例如以下:http://blog.csdn.net/jmy5945hh/article/details/20536929
結果顯示
獲得矩陣元素間最大值
詳細代碼
/*****************計算矩陣參數間最大值**********************/ mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvMax(&src1, &src2, &src3); printf("cvMax(mat1, mat2):\n"); showMatdate(mat3);
類似的還有cvMaxS:計算矩陣元素和參數的最大值。cvAvg:計算矩陣元素的平均值。
cvAvgSdv:計算矩陣元素的平均值和標准差。
cvMin:計算矩陣參數間最小值。
cvMinS:計算矩陣元素和參數的最小值。
結果顯示
單通道合成多通道矩陣
詳細代碼
mat3 = Mat(1, 3, CV_8UC3); src3 = mat3; cvMerge(&src1, &src2, 0, 0, &src3); printf("cvMax(mat1, mat2):\n"); showMatdate(mat3);
相應的函數為:split()(將多通道分離為單通道矩陣)。
獲取矩陣最大最小元素
詳細代碼
printf("mat1:\n"); showMatdate(mat1); cvMinMaxLoc(&src1, &min, &max, &min_p1, &max_p2); printf("min:%lf, min_p1.x:%d, min_p1.y:%d\n", min, min_p1.x, min_p1.y); printf("max:%lf, max_p2.x:%d, max_p2.y:%d\n", max, max_p2.x, max_p2.y);
獲取到最大最小值:max,min。以及它們的相應位置坐標:min_p1, max_p2。
結果顯示
兩個矩陣傅里葉頻譜相乘
詳細代碼
printf("mat1:\n"); showMatdate(mat1); printf("mat2:\n"); showMatdate(mat2); mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvMulSpectrums(&src1, &src2, &src3, DFT_ROWS); printf("mat3:\n"); showMatdate(mat3);
結果顯示
矩陣乘法
詳細代碼
printf("mat1:\n"); showMatdate(mat1); printf("mat2:\n"); showMatdate(mat2); mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvMul(&src1, &src2, &src3, 3); printf("cvMul(mat1 * mat2 * 3):\n"); showMatdate(mat3);
結果顯示
矩陣和轉置的乘積
詳細代碼
printf("mat1:\n"); showMatdate(mat1); printf("mat2:\n"); showMatdate(mat2); mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; cvMulTransposed(&src1, &src3, 0, &src2); printf("cvMulTransposed(mat1):\n"); showMatdate(mat3);
void cvMulTransposed( const CvArr* src, CvArr* dst, int order, const CvArr* delta=NULL ); src:輸入矩陣 dst:目標矩陣 order:乘法順序 delta:一個可選數組, 在乘法之前從 src 中減去該數組。函數 cvMulTransposed 計算 src 和它的轉置的乘積。 函數求值公式: 假設 order=0 dst=(src-delta)*(src-delta)T 否則 dst=(src-delta)T*(src-delta)
結果顯示
矩陣絕對差等
詳細代碼
printf("mat1:\n"); showMatdate(mat1); printf("mat2:\n"); showMatdate(mat2); mat3 = Mat(3, 3, CV_64FC1); src3 = mat3; tmp = cvNorm(&src1, &src2, NORM_L1); printf("cvNorm(mat1, mat2, NORM_INF):%lf\n", tmp);
double cvNorm(const CvArr* arr1, const CvArr* arr2=NULL, int norm_type=CV_L2, const CvArr* mask=NULL ) 假設arr2 == NULL 則:否則:
或者
![]()
結果顯示
極性坐標轉換到笛卡爾坐標
詳細代碼
printf("mat1:\n"); showMatdate(mat1); printf("mat2:\n"); showMatdate(mat2); mat3 = Mat(3, 1, CV_64FC1); src3 = mat3; mat4 = Mat(3, 1, CV_64FC1); src4 = mat4; cvPolarToCart(&src1, &src2, &src3, &src4, true); printf("cvPolarToCart(mat1, mat2)--x:\n"); showMatdate(mat3); printf("cvPolarToCart(mat1, mat2)--y:\n"); showMatdate(mat4);
void cvPolarToCart(const CvArr* magnitude, const CvArr* angle, CvArr* x, CvArr* y, int angle_in_degrees=0)
magnitude:極坐標的長度。angle:極坐標的角度。 x:笛卡爾X坐標。
y:笛卡爾Y坐標。 angle_in_degrees:若為true,表示輸入的是角度,否則表示輸入的是弧度。
結果顯示
矩陣元素求冪
詳細代碼
printf("mat1:\n"); showMatdate(mat1); mat3 = Mat(3, 1, CV_64FC1); src3 = mat3; cvPow(&src1, &src3, 2); printf("cvPow(mat1, 2):\n"); showMatdate(mat3);
結果顯示
矩陣簡化為向量
詳細代
printf("mat1:\n"); showMatdate(mat1); mat3 = Mat(3, 1, CV_64FC1); src3 = mat3; cvReduce(&src1, &src3, 1, CV_REDUCE_MAX); printf("cvReduce(mat1, 1 , CV_REDUCE_MAX):\n"); showMatdate(mat3);
void cvReduce(const CvArr* src, CvArr* dst, int dim=-1, int op=CV_REDUCE_SUM) src:待簡化的矩陣。 dst:生成的向量。 dim:0意味着矩陣被處理成一行,1意味着矩陣被處理成為一列,-1時維數將依據輸出向量的大小自己主動選擇. op: CV_REDUCE_SUM-輸出是矩陣的全部行/列的和. CV_REDUCE_AVG-輸出是矩陣的全部行/列的平均向量. CV_REDUCE_MAX-輸出是矩陣的全部行/列的最大值. CV_REDUCE_MIN-輸出是矩陣的全部行/列的最小值.