OpenCV 創建 Mat 對象的幾種方法


使用 Mat() 構造函數

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char ** argv)
{
    Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));
    cout << "M = " << endl << " " << M << endl << endl;


    return 0;
}

輸出:

M =
 [  0,   0, 255,   0,   0, 255;
   0,   0, 255,   0,   0, 255]

在C/C++中通過構造函數進行初始化

這種方法為在C/C++中通過構造函數進行初始化,示范代碼如下。

int sz[3]={2,2,2};
Mat L(3,sz,CV_8UC,Scalar::all(0));

上面的例子演示了如何創建一個超過兩維的矩陣:指定維數,然后傳遞一個指向一個數組的指針,這個數組包含每個維度的尺寸;后續的兩個參數與方法一中的相同。

為已存在的Ipllmage指針創建信息頭

為已存在的Ipllmage指針創建信息頭,示范代碼如下。

IplImage*img =cvLoadImage("1.jpg",1);
Mat mtx(img);//轉換IplImage*->Mat

利用Mat類中的Create()函數

利用Mat類中的Create()成員函數進行Mat類的初始化操作。

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char ** argv)
{
    Mat M;
    M.create(4, 4, CV_8UC(2));
    cout << "M = " << endl << " " << M << endl << endl;

    return 0;
}

輸出:

M =
 [205, 205, 205, 205, 205, 205, 205, 205;
 205, 205, 205, 205, 205, 205, 205, 205;
 205, 205, 205, 205, 205, 205, 205, 205;
 205, 205, 205, 205, 205, 205, 205, 205]

采用Matlab式的初始化

采用Matlab形式的初始化方式:zeros()),ones(),eyes()。使用以下方式指定尺寸和數據類型:

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char ** argv)
{
    Mat E = Mat::eye(4, 4, CV_64F);
    cout << "E = " << endl << " " << E << endl << endl;

    Mat O = Mat::ones(2, 2, CV_32F);
    cout << "O = " << endl << " " << O << endl << endl;

    Mat Z = Mat::zeros(3, 3, CV_8UC1);
    cout << "Z = " << endl << " " << Z << endl << endl;

    return 0;
}

輸出:

E =
 [1, 0, 0, 0;
 0, 1, 0, 0;
 0, 0, 1, 0;
 0, 0, 0, 1]

O =
 [1, 1;
 1, 1]

Z =
 [  0,   0,   0;
   0,   0,   0;
   0,   0,   0]

對小矩陣使用逗號分隔式初始化函數

對小矩陣使用逗號分隔式初始化函數,示范代碼如下。

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char ** argv)
{
    Mat C = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    cout << "C = " << endl << " " << C << endl << endl;

    return 0;
}

輸出:

C =
 [0, -1, 0;
 -1, 5, -1;
 0, -1, 0]

為已存在的對象創建新信息頭

使用成員函數clone()或者copyTo()為一個已存在的Mat對象創建一個新的信息頭,示范代碼如下。

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char ** argv)
{
    Mat C = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    Mat RowClone = C.row(1).clone();
    cout << "RowClone = " << endl << " " << RowClone << endl << endl;

    return 0;
}

輸出:

RowClone =
 [-1, 5, -1]




參考:

《OpenCV3 編程入門》 毛星雲 P90


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM