Mat的9种方式创建,及元素(像素)操作运算
Mat的9种方式创建,及元素(像素)操作运算:
包括数据位深度8位、32位,数据类型U:uchar、F:float型以及通道数C1:单通道、C3:三通道、C4:四通道
直接手动创建矩阵,基本方法是指定矩阵尺寸和数据类型:
#include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main() { /* Mat矩阵存储的数据类型 CV_8UC1// 8位无符号单通道 CV_8UC3// 8位无符号3通道 CV_8UC4 CV_32FC1// 32位浮点型单通道 CV_32FC3// 32位浮点型3通道 CV_32FC4 */ Mat a(Size(3,3),CV_8UC1); //创建3行3列的单通道矩阵,采用默认初始化方式 //也可以这样写:Mat a(3,3,CV_8UC1) Mat b(Size(3,3),CV_8UC3); //创建3行3列的三通道矩阵,三通道矩阵中,一个矩阵元素包含3个变量。 cout<<"a="<<a<<endl; cout<<"b="<<b<<endl; //对矩阵进行初始化 Mat c=Mat::zeros(Size(3,3),CV_8UC1); //全零矩阵 Mat d=Mat::ones(Size(4,4),CV_8UC4); //全1矩阵 cout<<"c="<<c<<endl; cout<<"d="<<d<<endl; system("pause"); return 0; }
Mat的9种创建方式及像素操作:
1 #include <iostream> 2 #include <opencv2/core.hpp> 3 #include <opencv2/highgui.hpp> 4 using namespace cv; 5 using namespace std; 6 7 Mat convertGray2Color(Mat img_gray) { 8 Mat img_color(img_gray.rows, img_gray.cols, CV_32FC3); 9 float tmp = 0; 10 for (int r = 0; r < img_gray.rows; r++) { 11 for (int c = 0; c < img_gray.cols; c++) { 12 tmp = img_gray.at<float>(r, c); 13 img_color.at<Vec3f>(r, c)[0] = abs(255 - tmp); //blue 14 img_color.at<Vec3f>(r, c)[1] = abs(127 - tmp); //green 15 img_color.at<Vec3f>(r, c)[2] = abs(0 - tmp); //red 16 } 17 } 18 return img_color; 19 } 20 21 int main() 22 { 23 std::cout << "Hello World!\n"; 24 //1 create a mat with random values 25 Mat m = Mat(2, 3, CV_32FC(1)); 26 randu(m, Scalar::all(0), Scalar::all(255)); 27 //cout << "random m" << m << endl; 28 //imshow("randomMat", convertGray2Color(m)); 29 //waitKey(0); 30 31 //2 create zeors or ones Mat 32 Mat m1; 33 m1.create(2, 3, CV_32FC(1)); 34 Mat m_zero = Mat::zeros(2, 3, CV_32FC1); 35 Mat m_one = Mat::ones(2, 3, CV_32FC1); 36 37 //3 common attribute of Mat 38 Mat m_initList = (Mat_<int>(2, 3) << 1, 2, 3, 4, 5, 6); 39 cout << m_initList << endl; 40 cout << "size=" << m_initList.size() << endl; 41 cout << "row="<< m_initList.rows << endl; 42 cout << "cols="<< m_initList.cols << endl; 43 cout << "channels=" << m_initList.channels() << endl; 44 cout << "areas=" << m_initList.total() << endl; 45 cout << "dims=" << m_initList.dims << endl; 46 47 //4 access element of Mat by at 48 Mat m2 = (Mat_<int>(3, 2) << 11, 12, 33, 43, 51, 16); 49 for (int r = 0; r < m2.rows; r++) { 50 for (int c = 0; c < m2.cols; c++) { 51 cout << m2.at<int>(r, c)<<","; 52 } 53 cout << endl; 54 } 55 //5 access element of Mat by ptr 56 for (int r = 0; r < m2.rows; r++) { 57 const int* ptr = m2.ptr<int>(r); 58 for (int c = 0; c < m2.cols; c++) { 59 cout << ptr[c] << ","; 60 } 61 cout << endl; 62 } 63 //6 access element of Mat by ptr and is continous 64 if (m2.isContinuous()) { 65 int* ptr = m2.ptr<int>(0); 66 for (int n = 0; n<m2.rows * m2.cols; n++) { 67 cout << ptr[n] << ","; 68 } 69 } 70 //Vec 71 Vec<int, 3>vi(21, 32, 14); 72 cout << "rows=" << vi.rows << endl; 73 cout << "cols=" << vi.cols << endl; 74 cout << "vi[0]=" << vi[0] << endl; 75 cout << "vi(0)=" << vi(0) << endl; 76 77 //7 get one row or one col of a Mat 78 int r = 0, c=0; 79 Mat mr = m2.row(r); 80 Mat mc = m2.col(c); 81 cout << "row r of m2" << mr << endl; 82 cout << "col c of m2" << mc << endl; 83 //8 get several rows or several cols of a Mat 84 Mat m3 = (Mat_<int>(5, 5) << 1, 2, 3, 4, 5, 6, 85 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 86 19, 20, 21, 22, 23, 24, 25); 87 Mat r_range = m3.rowRange(Range(2, 4)); 88 cout << "r_range"<< r_range << endl; 89 Mat c_range = m3.colRange(Range(1, 3)); 90 cout << "c_range" << r_range << endl; 91 92 Mat r_range_clone1 = m3.rowRange(2, 4).clone(); 93 Mat r_range_clone2; 94 m3.rowRange(2, 4).copyTo(r_range_clone2); 95 //9 get sub region of a Mat 96 Mat roi1 = m3(Rect(Point(2, 1), Point(3, 2))); //point at left up corner, and right down corner 97 Mat roi2 = m3(Rect(2, 1, 2, 2)); //x,y,width, height 98 Mat roi3 = m3(Rect(Point(2, 1), Size(2, 2))); //point at left up corner, and size 99 100 101 return EXIT_SUCCESS; 102 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程