OpenCV算法精解3--OpenCV中C++矩阵基本运算
生活随笔
收集整理的這篇文章主要介紹了
OpenCV算法精解3--OpenCV中C++矩阵基本运算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼環境:Visual studio2017和Anaconda;
參考書籍:張平《OpenCV算法精解》;
編程語言:Python和C++;
Python3基礎學習:Python3基礎
C++基礎學習:C++基礎
1.加法運算
// 矩陣運算包括:加法、減法、點乘、點除、乘法等; // 1.加法運算 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {/*構造兩個矩陣:src1 = [10 200 30 30 40 50]src2 = [30 80 5050 60 70]*/// 1.mat加法// 使用"+",當和超過255會進行截斷;Mat src1 = (Mat_<uchar>(2, 3) << 10, 200, 30, 30, 40, 50);Mat src2 = (Mat_<uchar>(2, 3) << 30, 80, 50, 50, 60, 70);Mat dst = src1 + src2; // 注意元素200+元素80的結果;結果為255而不是280;// 使用"+",可以將一個數值和一個矩陣相加;float num1 = 200;Mat dst1 = src1 + num1;cout << "src1 + src2 = \n" << dst << endl;cout << "數值和矩陣相加 = \n" << dst1 << endl; // 輸出dst1和src1類型相同;// 使用add函數進行加法// void add(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray(),int dtype = -1)// 使用add函數,輸入矩陣數據類型可以不同,輸出矩陣數據類型根據情況自行指定;// 當src1和src2相同時,才可以令dtype = -1,否則會報錯;Mat dst2;add(src1, src2, dst2, Mat(), CV_64FC1);cout << "使用add函數進行加法:\n" << dst2 << endl;return 0; }2.減法運算
// 2.減法運算 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {/*構造兩個矩陣:src1 = [10 200 30 30 40 50]src2 = [30 80 5050 60 70]*/// 2.mat減法// 使用"-",當減法小于0時,進行截斷;Mat src1 = (Mat_<uchar>(2, 3) << 10, 200, 30, 30, 40, 50);Mat src2 = (Mat_<uchar>(2, 3) << 30, 80, 50, 50, 60, 70);Mat dst = src2 - src1; // 注意相減小于0時的結果;cout << "src2 - src1 = \n" << dst << endl;// 使用subtract函數進行減法// void substract(InputArray src1,InputArray src2,OutputArray dst,InputArray mask = noArray(),int dtype = -1)Mat dst1;subtract(src2, src1, dst1, Mat(), CV_64FC1);cout << "使用add函數進行加法:\n" << dst1 << endl; // 對比"-"和"substract"的結果;return 0; }3.點乘運算
// 3.點乘 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {/*構造兩個矩陣:src1 = [10 200 30 30 40 50]src2 = [30 80 5050 60 70]*/// 3.點乘:兩個矩陣對應位置的數值相乘;// mul成員函數:兩個Mat對象數據類型相同才能進行點乘,返回矩陣數據類型不變;// mul成員函數結果超過255會進行截斷;Mat src1 = (Mat_<uchar>(2, 3) << 10, 200, 30, 30, 40, 50);Mat src2 = (Mat_<uchar>(2, 3) << 30, 80, 50, 50, 60, 70);Mat dst = src1.mul(src2);cout << "點乘結果:\n" << dst << endl;cout << "-----------------------" << endl;// multiply函數// void multiply(InputArray src1, InputArray src2, OutputArray dst, double scale = 1, int dtype = -1)// 注:dst = scale * src1 * src2,在點乘結果基礎上乘以放縮系數scale;Mat src3 = (Mat_<uchar>(2, 3) << 10, 200, 30, 30, 40, 50);Mat src4 = (Mat_<float>(2, 3) << 30, 80, 50, 50, 60, 70);Mat dst1;multiply(src3, src4, dst1, 1.0, CV_32FC1);for (int r = 0; r < dst1.rows; r++) {for (int c = 0; c < dst1.cols; c++) {cout << dst1.at<float>(r, c) << ",";}cout << endl;}return 0; }4.點除運算
// 4.點除 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc, char *argv[]) {// 4.點除Mat src1 = (Mat_<uchar>(2, 3) << 10, 200, 30, 30, 40, 50);Mat src2 = (Mat_<uchar>(2, 3) << 30, 80, 50, 50, 60, 70);Mat dst1 = src2 / src1;for (int r = 0; r < dst1.rows; r++) {for (int c = 0; c < dst1.cols; c++) {cout << float(dst1.at<uchar>(r, c)) << ",";}cout << endl;}cout << "------------------" << endl;Mat dst2;divide(src2, src1, dst2, 1.0, -1);for (int r = 0; r < dst2.rows; r++) {for (int c = 0; c < dst2.cols; c++) {cout << float(dst2.at<uchar>(r, c)) << ",";}cout << endl;}return 0; }5.乘法運算
// 5.乘法運算 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc, char *argv[]) {// 5.矩陣乘法/*src1 = [[1 2 3],[4 5 6]];src2 = [[6 5],[4 3],[2 1]];*/Mat src1 = (Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);Mat src2 = (Mat_<float>(3, 2) << 6, 5, 4, 3, 2, 1);Mat dst1 = src1 * src2;cout << "src1 * src2 = \n" << dst1 << endl;return 0; } // 使用gemm實現矩陣乘法// void gemm(InputArray src1,InputArray src2,double alpha,InputArray src3,double beta,OutputArray dst,int flags = 0)// src1:輸入類型是CV_32F或CV_64F的單或雙通道矩陣;// src2:輸入矩陣,類型和src1類型相同;// alpha:src1與src2相乘后的系數;// src3:輸入矩陣,類型和src1類型相同;// beta:src3的系數;// dst:輸出矩陣;// flags:所取值--0,GEMM_1_T,GEMM_2_T,GEMM_3_T;// flags控制src1、src2、src3是否轉置來實現矩陣之間的不同運算// a.dst = alpha * src1 * src2 + beta * src3,flags = 0;// b.dst = alpha * src1^T(src1轉置) * src2 + beta * src3,flags = GEMM_1_T;// c.dst = alpha * src1 * src2^T(src2轉置) + beta * src3,flags = GEMM_2_T;// d.dst = alpha * src1 * src2 + beta * src3^T(src3轉置),flags = GEMM_3_T; // 使用gemm實現矩陣乘法 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc, char *argv[]) {// 5.矩陣乘法/*src1 = [[1 2 3],[4 5 6]];src2 = [[6 5],[4 3],[2 1]];*/Mat src1 = (Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);Mat src2 = (Mat_<float>(3, 2) << 6, 5, 4, 3, 2, 1);// 使用gemm函數實現乘法Mat dst1;gemm(src1, src2, 1, NULL, 0, dst1, 0);cout << "gemm實現乘法:\n" << dst1 << endl;return 0; }總結
以上是生活随笔為你收集整理的OpenCV算法精解3--OpenCV中C++矩阵基本运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Http状态码完整说明
- 下一篇: 转载并学习实现三重DES加密解密代码(一