OpenCV算法精解3--OpenCV中C++矩阵基本运算
生活随笔
收集整理的這篇文章主要介紹了
OpenCV算法精解3--OpenCV中C++矩阵基本运算
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
代碼環(huán)境:Visual studio2017和Anaconda;
參考書籍:張平《OpenCV算法精解》;
編程語言:Python和C++;
Python3基礎(chǔ)學(xué)習(xí):Python3基礎(chǔ)
C++基礎(chǔ)學(xué)習(xí):C++基礎(chǔ)
1.加法運(yùn)算
// 矩陣運(yùn)算包括:加法、減法、點(diǎn)乘、點(diǎn)除、乘法等; // 1.加法運(yùn)算 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {/*構(gòu)造兩個(gè)矩陣:src1 = [10 200 30 30 40 50]src2 = [30 80 5050 60 70]*/// 1.mat加法// 使用"+",當(dāng)和超過255會(huì)進(jìn)行截?cái)?#xff1b;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的結(jié)果;結(jié)果為255而不是280;// 使用"+",可以將一個(gè)數(shù)值和一個(gè)矩陣相加;float num1 = 200;Mat dst1 = src1 + num1;cout << "src1 + src2 = \n" << dst << endl;cout << "數(shù)值和矩陣相加 = \n" << dst1 << endl; // 輸出dst1和src1類型相同;// 使用add函數(shù)進(jìn)行加法// void add(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray(),int dtype = -1)// 使用add函數(shù),輸入矩陣數(shù)據(jù)類型可以不同,輸出矩陣數(shù)據(jù)類型根據(jù)情況自行指定;// 當(dāng)src1和src2相同時(shí),才可以令dtype = -1,否則會(huì)報(bào)錯(cuò);Mat dst2;add(src1, src2, dst2, Mat(), CV_64FC1);cout << "使用add函數(shù)進(jìn)行加法:\n" << dst2 << endl;return 0; }2.減法運(yùn)算
// 2.減法運(yùn)算 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {/*構(gòu)造兩個(gè)矩陣:src1 = [10 200 30 30 40 50]src2 = [30 80 5050 60 70]*/// 2.mat減法// 使用"-",當(dāng)減法小于0時(shí),進(jìn)行截?cái)?#xff1b;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時(shí)的結(jié)果;cout << "src2 - src1 = \n" << dst << endl;// 使用subtract函數(shù)進(jìn)行減法// 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函數(shù)進(jìn)行加法:\n" << dst1 << endl; // 對(duì)比"-"和"substract"的結(jié)果;return 0; }3.點(diǎn)乘運(yùn)算
// 3.點(diǎn)乘 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc,char *argv[]) {/*構(gòu)造兩個(gè)矩陣:src1 = [10 200 30 30 40 50]src2 = [30 80 5050 60 70]*/// 3.點(diǎn)乘:兩個(gè)矩陣對(duì)應(yīng)位置的數(shù)值相乘;// mul成員函數(shù):兩個(gè)Mat對(duì)象數(shù)據(jù)類型相同才能進(jìn)行點(diǎn)乘,返回矩陣數(shù)據(jù)類型不變;// mul成員函數(shù)結(jié)果超過255會(huì)進(jìn)行截?cái)?#xff1b;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 << "點(diǎn)乘結(jié)果:\n" << dst << endl;cout << "-----------------------" << endl;// multiply函數(shù)// void multiply(InputArray src1, InputArray src2, OutputArray dst, double scale = 1, int dtype = -1)// 注:dst = scale * src1 * src2,在點(diǎn)乘結(jié)果基礎(chǔ)上乘以放縮系數(shù)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.點(diǎn)除運(yùn)算
// 4.點(diǎn)除 #include <opencv2/core/core.hpp> #include <iostream> using namespace std; using namespace cv;int main(int argc, char *argv[]) {// 4.點(diǎn)除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.乘法運(yùn)算
// 5.乘法運(yùn)算 #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實(shí)現(xiàn)矩陣乘法// 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相乘后的系數(shù);// src3:輸入矩陣,類型和src1類型相同;// beta:src3的系數(shù);// dst:輸出矩陣;// flags:所取值--0,GEMM_1_T,GEMM_2_T,GEMM_3_T;// flags控制src1、src2、src3是否轉(zhuǎn)置來實(shí)現(xiàn)矩陣之間的不同運(yùn)算// a.dst = alpha * src1 * src2 + beta * src3,flags = 0;// b.dst = alpha * src1^T(src1轉(zhuǎn)置) * src2 + beta * src3,flags = GEMM_1_T;// c.dst = alpha * src1 * src2^T(src2轉(zhuǎn)置) + beta * src3,flags = GEMM_2_T;// d.dst = alpha * src1 * src2 + beta * src3^T(src3轉(zhuǎn)置),flags = GEMM_3_T; // 使用gemm實(shí)現(xiàn)矩陣乘法 #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函數(shù)實(shí)現(xiàn)乘法Mat dst1;gemm(src1, src2, 1, NULL, 0, dst1, 0);cout << "gemm實(shí)現(xiàn)乘法:\n" << dst1 << endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的OpenCV算法精解3--OpenCV中C++矩阵基本运算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Http状态码完整说明
- 下一篇: s3c2440移植MQTT