代码环境:Visual studio2017和Anaconda;
参考书籍:张平《OpenCV算法精解》;
编程语言:Python和C++;
Python3基础学习:Python3基础
C++基础学习:C++基础
1.加法运算
// 矩阵运算包括:加法、减法、点乘、点除、乘法等; // 1.加法运算 #include2.减法运算#include using namespace std; using namespace cv; int main(int argc,char *argv[]) { // 1.mat加法 // 使用"+",当和超过255会进行截断; Mat src1 = (Mat_ (2, 3) << 10, 200, 30, 30, 40, 50); Mat src2 = (Mat_ (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.减法运算 #include3.点乘运算#include using namespace std; using namespace cv; int main(int argc,char *argv[]) { // 2.mat减法 // 使用"-",当减法小于0时,进行截断; Mat src1 = (Mat_ (2, 3) << 10, 200, 30, 30, 40, 50); Mat src2 = (Mat_ (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.点乘 #include4.点除运算#include using namespace std; using namespace cv; int main(int argc,char *argv[]) { // 3.点乘:两个矩阵对应位置的数值相乘; // mul成员函数:两个Mat对象数据类型相同才能进行点乘,返回矩阵数据类型不变; // mul成员函数结果超过255会进行截断; Mat src1 = (Mat_ (2, 3) << 10, 200, 30, 30, 40, 50); Mat src2 = (Mat_ (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_ (2, 3) << 10, 200, 30, 30, 40, 50); Mat src4 = (Mat_ (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 (r, c) << ","; } cout << endl; } return 0; }
// 4.点除 #include5.乘法运算#include using namespace std; using namespace cv; int main(int argc, char *argv[]) { // 4.点除 Mat src1 = (Mat_ (2, 3) << 10, 200, 30, 30, 40, 50); Mat src2 = (Mat_ (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 (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 (r, c)) << ","; } cout << endl; } return 0; }
// 5.乘法运算 #include#include using namespace std; using namespace cv; int main(int argc, char *argv[]) { // 5.矩阵乘法 Mat src1 = (Mat_ (2, 3) << 1, 2, 3, 4, 5, 6); Mat src2 = (Mat_ (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#include using namespace std; using namespace cv; int main(int argc, char *argv[]) { // 5.矩阵乘法 Mat src1 = (Mat_ (2, 3) << 1, 2, 3, 4, 5, 6); Mat src2 = (Mat_ (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; }



