opencv矩阵运算(1)
生活随笔
收集整理的這篇文章主要介紹了
opencv矩阵运算(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
從本篇開始整理下opencv實現的矩陣計算相關函數使用。
計算公式為:src3 = src1 * 0.5 + src2 * 0.5 + 3;
需要先把mat1和mat2轉換為格式CV_8UC1,然后室友函數cvCmp進行比較。注意cvCmp的flag標志,本例使用的是相等:CMP_EQ,也就是將mat1和mat2 矩陣對應位置的數值比較,如果相等,則mat3對應位置數值設置為255,否則設置為0。對應的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中,當flag小于0時,水平垂直都翻轉;flag為0時,垂直翻轉;flag大于0時,水平翻轉。
矩陣初始化
具體代碼
這里初始化了兩個3X3矩陣,并將它的數據顯示出來: <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; /*************顯示矩陣數據***************************/printf("mat1:\n");showMatdate(mat1);printf("mat2:\n");showMatdate(mat2);return 0; }結果顯示
矩陣絕對值之差
具體代碼
<pre name="code" class="cpp">/*************兩個矩陣絕對值之差*********************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvAbsDiff(&src1, &src2, &src3);printf("cvAbsDiff(mat1, mat2):\n");showMatdate(mat3);結果顯示
矩陣與數值差的絕對值
具體代碼
<pre name="code" class="cpp">/*************矩陣與數值差的絕對值*******************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvAbsDiffS(&src1, &src3, Scalar(5));printf("cvAbsDiffS(mat1, 5):\n");showMatdate(mat3);結果顯示
矩陣相加
具體代碼
<pre name="code" class="cpp">/************兩個矩陣相加***************************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvAdd(&src1, &src2, &src3);printf("cvAdd(mat1, mat2):\n");showMatdate(mat3);結果顯示
矩陣權重相加
具體代碼
<pre name="code" class="cpp">/**********兩個矩陣以權重形式相加******************/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);計算公式為:src3 = src1 * 0.5 + src2 * 0.5 + 3;
結果顯示
矩陣的與計算
具體代碼
<pre name="code" class="cpp">/*******************矩陣與計算********************** *******可以使用掩碼來決定計算被的數據元素********* *******對應的還有cvNot cvOr cvXor *****************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvAnd(&src1, &src2, &src3);printf("cvAnd(mat1, mat2):\n");showMatdate(mat3);結果顯示
矩陣比較
具體代碼
<pre name="code" class="cpp">/******************兩個矩陣比較********************/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轉換為格式CV_8UC1,然后室友函數cvCmp進行比較。注意cvCmp的flag標志,本例使用的是相等:CMP_EQ,也就是將mat1和mat2 矩陣對應位置的數值比較,如果相等,則mat3對應位置數值設置為255,否則設置為0。對應的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.
結果顯示
計算矩陣絕對值
具體代碼
<pre name="code" class="cpp">/******************計算絕對值************************/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 |;結果顯示
計算矩陣非0元素個數
具體代碼
<pre name="code" class="cpp">/****************計算矩陣非0元素的個數***************/int sum = 0;showMatdate(mat2);sum = cvCountNonZero(&src2);printf("sum=%d\n", sum);結果顯示
矩陣除法計算
具體代碼
<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}};/*****************數組除法運算************************/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對應那一位的結果直接為0。結果顯示
矩陣行列式計算
具體代碼
<pre name="code" class="cpp">/*****************矩陣行列式計算**********************/double sum = 0;sum = cvDet(&src1);showMatdate(mat1);printf("cvDet(mat1)=%.1lf\n", sum);結果顯示
矩陣元素指數計算
具體代碼
<pre name="code" class="cpp">/*****************矩陣元素指數計算**********************/mat3 = Mat(3, 3, CV_64FC1);src3 = mat3;cvExp(&src1, &src3);printf("cvExp(mat1)\n");showMatdate(mat3);計算公式如下:結果顯示[編輯?|?編輯源代碼]
矩陣水平/垂直翻轉
具體代碼
<pre name="code" class="cpp">/*****************矩陣水平或者垂直翻轉**********************/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中,當flag小于0時,水平垂直都翻轉;flag為0時,垂直翻轉;flag大于0時,水平翻轉。
總結
以上是生活随笔為你收集整理的opencv矩阵运算(1)的全部內容,希望文章能夠幫你解決所遇到的問題。