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進行數乘運算 每個對應的矩陣元素相乘 而不是進行矩陣乘法,內積運算