opencv矩阵运算(1)
生活随笔
收集整理的這篇文章主要介紹了
opencv矩阵运算(1)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
從本篇開(kāi)始整理下opencv實(shí)現(xiàn)的矩陣計(jì)算相關(guān)函數(shù)使用。
計(jì)算公式為:src3 = src1 * 0.5 + src2 * 0.5 + 3;
需要先把mat1和mat2轉(zhuǎn)換為格式CV_8UC1,然后室友函數(shù)cvCmp進(jìn)行比較。注意cvCmp的flag標(biāo)志,本例使用的是相等:CMP_EQ,也就是將mat1和mat2 矩陣對(duì)應(yīng)位置的數(shù)值比較,如果相等,則mat3對(duì)應(yīng)位置數(shù)值設(shè)置為255,否則設(shè)置為0。對(duì)應(yīng)的flag有: <pre name="code" class="cpp">CMP_EQ src1 is equal to src2. CMP_GT src1 is greater than src2. CMP_GE src1 is greater than or equal to src2. CMP_LT src1 is less than src2. CMP_LE src1 is less than or equal to src2. CMP_NE src1 is unequal to src2.
注意:在cvFlip中,當(dāng)flag小于0時(shí),水平垂直都翻轉(zhuǎn);flag為0時(shí),垂直翻轉(zhuǎn);flag大于0時(shí),水平翻轉(zhuǎn)。
矩陣初始化
具體代碼
這里初始化了兩個(gè)3X3矩陣,并將它的數(shù)據(jù)顯示出來(lái): <pre name="code" class="cpp">double x[3][3] = {{1, 50, -100}, {1, -110, 220}, {-1, 150, 150}}; double y[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};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\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);printf("mat2:\n");showMatdate(mat2);return 0; }結(jié)果顯示
矩陣絕對(duì)值之差
具體代碼
<pre name="code" class="cpp">/*************兩個(gè)矩陣絕對(duì)值之差*********************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvAbsDiff(&src1, &src2, &src3);printf("cvAbsDiff(mat1, mat2):\n");showMatdate(mat3);結(jié)果顯示
矩陣與數(shù)值差的絕對(duì)值
具體代碼
<pre name="code" class="cpp">/*************矩陣與數(shù)值差的絕對(duì)值*******************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvAbsDiffS(&src1, &src3, Scalar(5));printf("cvAbsDiffS(mat1, 5):\n");showMatdate(mat3);結(jié)果顯示
矩陣相加
具體代碼
<pre name="code" class="cpp">/************兩個(gè)矩陣相加***************************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvAdd(&src1, &src2, &src3);printf("cvAdd(mat1, mat2):\n");showMatdate(mat3);結(jié)果顯示
矩陣權(quán)重相加
具體代碼
<pre name="code" class="cpp">/**********兩個(gè)矩陣以權(quán)重形式相加******************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvAddWeighted(&src1, 0.5, &src2, 0.5, 3, &src3);printf("cvAddWeighted(mat1, 0.5,mat2, 0.5, 3):\n");showMatdate(mat3);計(jì)算公式為:src3 = src1 * 0.5 + src2 * 0.5 + 3;
結(jié)果顯示
矩陣的與計(jì)算
具體代碼
<pre name="code" class="cpp">/*******************矩陣與計(jì)算********************** *******可以使用掩碼來(lái)決定計(jì)算被的數(shù)據(jù)元素********* *******對(duì)應(yīng)的還有cvNot cvOr cvXor *****************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvAnd(&src1, &src2, &src3);printf("cvAnd(mat1, mat2):\n");showMatdate(mat3);結(jié)果顯示
矩陣比較
具體代碼
<pre name="code" class="cpp">/******************兩個(gè)矩陣比較********************/int tmp = CMP_EQ;mat3 = Mat(3, 3, CV_8UC1);src3 = mat3;mat1.convertTo(mat1, CV_8UC1);mat2.convertTo(mat2, CV_8UC1);cvCmp(&src1, &src2, &src3, tmp);printf("cvCmp(mat1, mat2):\n");showMatdate(mat3);需要先把mat1和mat2轉(zhuǎn)換為格式CV_8UC1,然后室友函數(shù)cvCmp進(jìn)行比較。注意cvCmp的flag標(biāo)志,本例使用的是相等:CMP_EQ,也就是將mat1和mat2 矩陣對(duì)應(yīng)位置的數(shù)值比較,如果相等,則mat3對(duì)應(yīng)位置數(shù)值設(shè)置為255,否則設(shè)置為0。對(duì)應(yīng)的flag有: <pre name="code" class="cpp">CMP_EQ src1 is equal to src2. CMP_GT src1 is greater than src2. CMP_GE src1 is greater than or equal to src2. CMP_LT src1 is less than src2. CMP_LE src1 is less than or equal to src2. CMP_NE src1 is unequal to src2.
結(jié)果顯示
計(jì)算矩陣絕對(duì)值
具體代碼
<pre name="code" class="cpp">/******************計(jì)算絕對(duì)值************************/mat3 = Mat(3, 3, CV_8UC1);src3 = mat3;cvConvertScaleAbs(&src1, &src3, 0.5, 4);printf("cvConvertScaleAbs(mat1, 0.5, 4):\n");showMatdate(mat3);注意:mat3 = | mat1 * 0.5 + 4 |;結(jié)果顯示
計(jì)算矩陣非0元素個(gè)數(shù)
具體代碼
<pre name="code" class="cpp">/****************計(jì)算矩陣非0元素的個(gè)數(shù)***************/int sum = 0;showMatdate(mat2);sum = cvCountNonZero(&src2);printf("sum=%d\n", sum);結(jié)果顯示
矩陣除法計(jì)算
具體代碼
<pre name="code" class="cpp">double x[3][3] = {{1, 50, -100}, {1, -110, 220}, {-1, 150, 150}}; double y[3][3] = {{1, 0, 0}, {0, 2, 0}, {0, 0, 3}};/*****************數(shù)組除法運(yùn)算************************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvDiv(&src1, &src2, &src3, 2);printf("cvDiv(mat1, mat2, 2)\n");showMatdate(mat3);注意:1、mat3 = mat1 * 2 / mat2。2、如果矩陣中mat2某一位為0,則mat3對(duì)應(yīng)那一位的結(jié)果直接為0。結(jié)果顯示
矩陣行列式計(jì)算
具體代碼
<pre name="code" class="cpp">/*****************矩陣行列式計(jì)算**********************/double sum = 0;sum = cvDet(&src1);showMatdate(mat1);printf("cvDet(mat1)=%.1lf\n", sum);結(jié)果顯示
矩陣元素指數(shù)計(jì)算
具體代碼
<pre name="code" class="cpp">/*****************矩陣元素指數(shù)計(jì)算**********************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvExp(&src1, &src3);printf("cvExp(mat1)\n");showMatdate(mat3);計(jì)算公式如下:結(jié)果顯示[編輯?|?編輯源代碼]
矩陣水平/垂直翻轉(zhuǎn)
具體代碼
<pre name="code" class="cpp">/*****************矩陣水平或者垂直翻轉(zhuǎn)**********************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvFlip(&src1, &src3, -1);printf("cvFlip(mat1, -1)\n");showMatdate(mat3);cvFlip(&src1, &src3, 0);printf("cvFlip(mat1, 0)\n");showMatdate(mat3);cvFlip(&src1, &src3, 1);printf("cvFlip(mat1, 1)\n");showMatdate(mat3);注意:在cvFlip中,當(dāng)flag小于0時(shí),水平垂直都翻轉(zhuǎn);flag為0時(shí),垂直翻轉(zhuǎn);flag大于0時(shí),水平翻轉(zhuǎn)。
總結(jié)
以上是生活随笔為你收集整理的opencv矩阵运算(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。