Mat的9种方式创建,及元素(像素)操作运算

发布时间 2023-08-06 22:28:26作者: 量子与太极

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 }