Mat類型的創建及運算--OpenCV01

Mat類型的構造方式有二十多種,僅學習了常用的構造方式。

1)利用im.read函數讀入圖像

    Mat Img1 = imread("C:/Users/Desktop/lena.jpg");//讀入圖像 路徑用/遞進
    namedWindow("Input img",WINDOW_AUTOSIZE); //創建一個窗口1
    imshow("Input img", Img1); //在窗口1上展示圖片

2)拷貝構造

    Mat Img2;
    Img2 = Img1.clone(); // Img2就拷貝了一份Img1的圖像
    imshow("output img", Img2);

3)相同類型構造

    Mat Img3;
    Img3 = Mat(Img1.size(), Img1.type()); //取圖像1的大小 圖像1的類型相同構造一個大小相同的矩陣
    Img3 = Scalar(255, 0, 0); //BGR 三位 
         //由於Img1是三通道的,故Scalar可以有三個參數賦值 
         //分別對應三通道的BGR  Blue Green Red
    namedWindow("Output img", WINDOW_AUTOSIZE); //創建一個窗口1
    imshow("Output img", Img2);

 4)構造時賦值操作

    //rows爲行數,cols爲列數  Size(cols,rows)
    Mat Img3(Size(480, 640), CV_8UC1); //構造一個行爲640 列爲480的 8位無符號單通道矩陣
    Img3 = Scalar(255);  //此單通道灰度圖像 可以將所以的單元賦值爲255 灰度值

    ///還可以直接在開始便進行賦值操作
    Mat a(2, 2, CV_8UC3, Scalar(255, 255, 255)); // 2*2 8位無符號三通道矩陣 每個元素都是255

5)利用數組構造

    Mat b = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
    //利用枚舉法賦值操作
    Mat c = cv::Mat_<int>(3, 3); //創建一個的3*3的矩陣
    for (int i = 0;i < c.rows;i++)
        for (int j = 0;j < c.cols;j++)
            c.at<int>(i, j) = i+j;  //給每個元素賦值操作

    //利用數組進行賦值//

    unsigned char arr[8] = { 5,6,7,8,1,2,3,4 };
    Mat f = cv::Mat(2, 2, CV_8UC2, arr);

6)類方法賦值


    //類方法賦值//

    Mat a = cv::Mat::eye(3,3,CV_8UC1); //構建3*3單位矩陣 對角元素爲1

    Mat b = (cv::Mat_<int>(1, 3) << 1, 2, 3); //構建1*3的矩陣 數據爲 1 2 3

    Mat c = cv::Mat::diag(b);  //c的對角元素爲b的元素 其餘都是0

    Mat d = cv::Mat::ones(3, 3, CV_8UC1); //構建單通道全爲1的3*3矩陣

    Mat e = cv::Mat::zeros(4, 2, CV_8UC1); //構建單通道全爲0的 4*2的矩陣

                                                                      Mat類的運算

Mat創建的是圖像矩陣,其運算規則類似與矩陣的運算。 乘法分爲矩陣的乘法與數乘運算

    Mat a = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
    Mat b = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
    
    //加法減法就是矩陣的加法減法 --乘法除法爲數乘數除
    c = a + b; 
    d = a - b;
    e = 2 * a;
    f = a / 2;

    Mat a1 = (cv::Mat_<double>(3, 3) << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
    Mat b1 = (cv::Mat_<double>(3, 3) << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);

     Mat g;

    
    g = a1 * b1;  
    //要進行矩陣乘法 元素類型必須都是CV_32FC1 CV_64FC1 CV_32FC1 CV_64FC2
    //即矩陣類型爲float或者double類型


    double k;
    k = a.dot(b); //dot返回類型是double
    //即把a矩陣擴展成一個行向量
    //b矩陣擴展成一個列向量 然後進行內積乘 
    // 結果即是1+4+9+16..... 1-9的平方和
    cout << k << endl;


    Mat m;
    m = a.mul(b); //a與b進行數乘運算 每個對應的矩陣元素相乘 而不是進行矩陣乘法,內積運算

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章