OPENCV學習筆記1-1_Mat 創建

    在2001年剛剛出現的時候,OpenCV基於 C 語言接口而建。爲了在內存(memory)中存放圖像,當時採用名爲 IplImage 的C語言結構體,但這種方法必須接受C語言所有的不足,這其中最大的不足要數手動內存管理,其依據是用戶要爲開闢和銷燬內存負責。爲此,OpenCV在2.0版本中引入了一個新的C++接口Mat(基於類的概念),利用自動內存管理給出瞭解決問題的新方法。但C++接口唯一的不足是當前許多嵌入式開發系統只支持C語言。

1.1 Mat 創建

  方法一:構造函數

    Mat img(2, 3, CV_8UC3, cv::Scalar(0, 0, 255));

    // CV_8UC3,CV_[The number of bits per item][Signed or Unsigned][TypePrefix]C[The channel number]

    //創建2行3列的矩陣,元素使用8位無符號char類型保存,具有3通道,每個像素的初始值是(0,0,255)

    //每個像素點都是由1*3的小矩陣構成(行X3,列不變)。

    Mat::Mat(Size size, int type, const Scalar& s)

    size: 2D array size(2D數組大小):  ``Size(cols, rows)`` . In the  ``Size()``  constructor, the number of rows and the number of columns go in the reverse order(相反的順序).

    param type: Array type. Use  ``CV_8UC1, ..., CV_64FC4``  to create 1-4 channel matrices

    param s: An optional value(可選值)to initialize each matrix element with. use the assignment operator(賦值運算符) ``Mat::operator=(const Scalar& value)`` .

  方法二:create方法

    //該方法不能爲矩陣設置初始值,只是在改變尺寸時爲矩陣數據重新分配內存。創建一個4行4列有2個通道的矩陣

    img.create(4, 4, CV_8UC(2));   

    如果create()函數指定的參數與圖像之前的參數相同,則不進行實質的內存申請操作;

    如果參數不同,則減少原始數據內存的索引,並重新申請內存。使用方法如下面例程所示:

    Mat M(2,2, CV_8UC3);//構造函數創建圖像

    M.create(3,2, CV_8UC2);//釋放內存重新創建圖像

    方法三:eye、ones、zeros方法

     Mat::eye, 矩陣元素爲對角矩陣

     Mat::ones, 矩陣元素置1

    Mat::zeros, 矩陣元素清零(單通道爲灰度圖像;彩色圖像顯示爲0即黑色) 

   其他:Mat複製等

1.2 示例

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

int main( int argc, char** argv )
{

    Mat img(3,2, CV_8UC3, Scalar(126,0,255));
    cout << "yunfung_opencv_learn_test:" <<"\n\n";
    cout << "img = \n " << img << "\n";

    Mat eye   = Mat::eye(4,3,CV_8U);
    Mat ones  = Mat::ones(4,3,CV_8U);

    Mat zeros;
    zeros.create(4,3,CV_8U);   //分配內存,不初始化元素

    cout << "eye   = \n " << eye   << "\n";
    cout << "ones  = \n " << ones  << "\n";
    cout << "zeros = \n " << zeros << "\n";

    return 0;
}

 

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