opencv计算两数组的乘积_opencv矩阵运算(2)
簡單介紹
本篇承接上一篇。繼續(xù)opencv下矩陣計算的函數(shù)使用。
計算矩陣的逆
注意:矩陣A是可逆矩陣的充分必要條件是行列式detA不等于0。
詳細(xì)代碼
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
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;
/*************顯示矩陣數(shù)據(jù)***************************/
printf("mat1:\n");
showMatdate(mat1);
/*****************矩陣的逆**********************/
mat3 = Mat(3, 3, CV_64FC1);
src3 = mat3;
cvInvert(&src1, &src3);
showMatdate(mat3);
return 0;
}
結(jié)果顯示
矩陣元素自然對數(shù)
詳細(xì)代碼
/*****************矩陣元素自然對數(shù)**********************/
mat3 = Mat(3, 3, CV_64FC1);
src3 = mat3;
cvLog(&src1, &src3);
showMatdate(mat3);
結(jié)果顯示
矩陣查找表轉(zhuǎn)換
詳細(xì)代碼
/*****************矩陣查找表轉(zhuǎn)換**×******************/
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].(假設(shè)mat1格式為CV_8U)
mat3 = src2[mat1 + 128].(假設(shè)mat1格式為CV_8S)
結(jié)果顯示
計算向量間馬氏距離
詳細(xì)代碼
/*************顯示矩陣數(shù)據(jù)***************************/
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);
結(jié)果顯示
獲得矩陣元素間最大值
詳細(xì)代碼
/*****************計算矩陣參數(shù)間最大值**********************/
mat3 = Mat(3, 3, CV_64FC1);
src3 = mat3;
cvMax(&src1, &src2, &src3);
printf("cvMax(mat1, mat2):\n");
showMatdate(mat3);
類似的還有cvMaxS:計算矩陣元素和參數(shù)的最大值。
cvAvg:計算矩陣元素的平均值。
cvAvgSdv:計算矩陣元素的平均值和標(biāo)準(zhǔn)差。
cvMin:計算矩陣參數(shù)間最小值。
cvMinS:計算矩陣元素和參數(shù)的最小值。
結(jié)果顯示
單通道合成多通道矩陣
詳細(xì)代碼
mat3 = Mat(1, 3, CV_8UC3);
src3 = mat3;
cvMerge(&src1, &src2, 0, 0, &src3);
printf("cvMax(mat1, mat2):\n");
showMatdate(mat3);
相應(yīng)的函數(shù)為:split()(將多通道分離為單通道矩陣)。
獲取矩陣最大最小元素
詳細(xì)代碼
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。以及它們的相應(yīng)位置坐標(biāo):min_p1, max_p2。
結(jié)果顯示
兩個矩陣傅里葉頻譜相乘
詳細(xì)代碼
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);
結(jié)果顯示
矩陣乘法
詳細(xì)代碼
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);
結(jié)果顯示
矩陣和轉(zhuǎn)置的乘積
詳細(xì)代碼
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:目標(biāo)矩陣
order:乘法順序
delta:一個可選數(shù)組, 在乘法之前從 src 中減去該數(shù)組。
函數(shù) cvMulTransposed 計算 src 和它的轉(zhuǎn)置的乘積。
函數(shù)求值公式:
假設(shè) order=0
dst=(src-delta)*(src-delta)T
否則
dst=(src-delta)T*(src-delta)
結(jié)果顯示
矩陣絕對差等
詳細(xì)代碼
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 )
假設(shè)arr2 == NULL
則:
否則:
或者
結(jié)果顯示
極性坐標(biāo)轉(zhuǎn)換到笛卡爾坐標(biāo)
詳細(xì)代碼
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:極坐標(biāo)的長度。
angle:極坐標(biāo)的角度。
x:笛卡爾X坐標(biāo)。
y:笛卡爾Y坐標(biāo)。
angle_in_degrees:若為true,表示輸入的是角度,否則表示輸入的是弧度。
結(jié)果顯示
矩陣元素求冪
詳細(xì)代碼
printf("mat1:\n");
showMatdate(mat1);
mat3 = Mat(3, 1, CV_64FC1);
src3 = mat3;
cvPow(&src1, &src3, 2);
printf("cvPow(mat1, 2):\n");
showMatdate(mat3);
結(jié)果顯示
矩陣簡化為向量
詳細(xì)代
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時維數(shù)將依據(jù)輸出向量的大小自己主動選擇.
op:
CV_REDUCE_SUM-輸出是矩陣的全部行/列的和.
CV_REDUCE_AVG-輸出是矩陣的全部行/列的平均向量.
CV_REDUCE_MAX-輸出是矩陣的全部行/列的最大值.
CV_REDUCE_MIN-輸出是矩陣的全部行/列的最小值.
結(jié)果顯示
總結(jié)
以上是生活随笔為你收集整理的opencv计算两数组的乘积_opencv矩阵运算(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现竖式步骤条_【色彩大详解】最适合考生
- 下一篇: mysql update锁_mysql中