首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

OpenCV Mat 矩陣深度解析:影像資料結構與核心操作

     編輯:關於C++

Mat 結構雙層設計

cv::Mat 由兩部分組成:

  • Matrix Header:存放尺寸、型別、通道數、參考計數、資料指標等元資料。
  • Matrix Data:實際像素資料塊,可被多個 Header 共享(參考計數機制)。

淺拷貝 vs 深拷貝

Mat A = imread("image.png");
Mat B(A);        // 建構函數:Header 複製,Data 共享(參考計數+1)
Mat C = A;       // 指派運算子:同上,Header 複製,Data 共享
// A, B, C 指向同一塊記憶體,修改任一者影響所有

最後一個使用者銷毀時自動釋放資料區塊(引用計數歸零)。

深拷貝方法

Mat F = A.clone();      // 完整複製 Header + Data
Mat G; A.copyTo(G);     // 同 clone,支援遮罩操作
// F, G 擁有獨立資料區塊,互不影響

Mat 建立與初始化多種方式

1. 建構函數指定尺寸與型別

Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255)); // 2x2, 3通道8位元無號, 紅色
cout << "M = " << M << endl;

型別命名規則:CV_[位元數][符號][類型前綴]C[通道數],如 CV_8UC3 = 8-bit unsigned, 3 channels。

2. create() 動態配置

Mat M; M.create(4, 4, CV_8UC(2)); // 4x4, 2通道

3. Matlab 風格靜態建立


Mat E = Mat::eye(4, 4, CV_64F);   // 單位矩陣
Mat O = Mat::ones(2, 2, CV_32F);  // 全 1
Mat Z = Mat::zeros(3, 3, CV_8UC1); // 全 0

4. 小矩陣逗號初始化


Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); // Laplacian 核

5. 隨機數填充


Mat R(3, 2, CV_8UC3);
randu(R, Scalar::all(0), Scalar::all(255));

輸出範例

關鍵觀念總結

  • Mat 是參考計數智慧指標,非傳統容器,淺拷貝極廉價。
  • 跨函數傳遞優先用 const Mat&,需修改副本時再 clone()。
  • 理解 isContinuous()、ptr()、step 等底層屬性,寫出高效像素級演算法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved