opencv之cv::Mat創建


opencv之cv::Mat創建

簡介

cv::Mat 是一個類,由兩個數據部分組成:矩陣信息頭(包含矩陣尺寸、存儲方法、存儲地址等信息)和一個指向存儲所有像素值的矩陣(根據所選存儲方法的不同, 矩陣可以是不同的維數)的指針。如果在程序中傳遞圖像並創建副本時,大的開銷是由矩陣造成的,而不是矩陣信息頭。為了解決矩陣拷貝的問題,opencv中使用了引用計數機制。思路就是讓每個cv::Mat 對象都自己的信息頭,但是共享同一個矩陣,從而拷貝矩陣只是復制矩陣信息頭和矩陣指針,而不是賦值矩陣

cv::Mat A, C;                          // 創建矩陣信息頭
A = cv::imread(argv[1], IMREAD_COLOR); // 為矩陣分配內存
cv::Mat B(A);                                 // 拷貝構造函數
C = A;                                    // 賦值運算符

注:矩陣A, B, C擁有自己獨特的矩陣信息頭,但是都指向同一個矩陣。

通過引用計數機制,當計數值為零時,矩陣會自動釋放內存

  • 拷貝cv::Mat
cv::Mat F = A.clone();
cv::Mat G;
A.copyTo(G);
  • Output image allocation for OpenCV functions is automatic (unless specified otherwise).
  • You do not need to think about memory management with OpenCVs C++ interface.
  • The assignment operator and the copy constructor only copies the header.
  • The underlying matrix of an image may be copied using the cv::Mat::clone() and cv::Mat::copyTo() functions.

創建cv::Mat對象的方法

  • 使用cv::Mat::Mat函數
cv::Mat matrix(2, 2, CV_8UC3, cv::Scalar(0, 0, 255));
cout << "M = " << endl << " " << M << endl << endl;

注:預先定義的通道數可以多達4個,cv::Scalar()既能用來初始化矩陣,也可以用來表示顏色

  • 使用c/c++數組初始化
int sz[3] = {2,2,2};
cv::Mat L(3,sz, CV_8UC, cv::Scalar::all(0));

注:該方法可以用來創建二維以上的矩陣,第一個參數為矩陣的維度,第二個參數為數組的指針,包含每個維度的尺寸。

  • cv::Mat::create函數
M.create(4,4, CV_8UC2);
cout << "M = "<< endl << " "  << M << endl << endl;

注:該方法不能為矩陣設置初始值,只是用於改變矩陣尺寸,為矩陣開辟新的內存。

  • 類似Matlab的方式
cv::Mat E = cv::Mat::eye(4, 4, CV_64F);
cout << "E = " << endl << " " << E << endl << endl;
cv::Mat O = cv::Mat::ones(2, 2, CV_32F);
cout << "O = " << endl << " " << O << endl << endl;
cv::Mat Z = cv::Mat::zeros(3,3, CV_8UC1);
cout << "Z = " << endl << " " << Z << endl << endl;
  • 對於小矩陣,使用逗號分隔符初始化
cv::Mat C = (cv::Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << "C = " << endl << " " << C << endl << endl;
C = (cv::Mat_<double>({0, -1, 0, -1, 5, -1, 0, -1, 0})).reshape(3);
cout << "C = " << endl << " " << C << endl << endl;
  • 為已存在的對象創建新信息頭
cv::Mat RowClone = C.row(1).clone();
cout << "RowClone = " << endl << " " << RowClone << endl << endl;
  • 為矩陣賦予隨機值
cv::Mat R = cv::Mat(3, 2, CV_8UC3);
cv::randu(R, cv::Scalar::all(0), cv::Scalar::all(255));

注:randu()函數的第二三個參數為最小最大值。

參考

opencv Mat數據的三種標准訪問方式 - Zack888 - 博客園
OpenCv2 學習筆記(6) Mat元素訪問和效率比較 - wanggao_1990的專欄 - CSDN博客


免責聲明!

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



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