摘要:本文主要介紹了Mat類中data指針訪問每一個像素的方法。
在訪問和修改圖像矩陣像素值的時候,我們經常會用到at,ptr,以及迭代器MatIterator等。對於用Mat存儲的圖像的像素值的訪問方法,文章http://blog.csdn.net/xiaowei_cqu/article/details/7771760已經介紹的很清楚,本文的重點在於用data訪問圖像元素值的時候遇到的一些問題。圖像矩陣是一個二維數組,不論是灰度圖像還是彩色圖像,在計算機內存中都是以一維數組的形式存儲的。用Mat存儲一幅圖像時,若圖像在內存中是連續存儲的(Mat對象的isContinuous == true),則可以將圖像的數據看成是一個一維數組,而其data(uchar*)成員就是指向圖像數據的第一個字節的,因此可以用data指針訪問圖像的數據,那么問題來了,OpenCV中將data定義為uchar*,而當我們用構造函數創建一個Mat對象的時候,可以指定圖像的數據類型有CV_8UC1、CV_8UC3、CV_32FC1、CV_32FC3等多種,那么我們如何通過data指針去訪問和修改圖像的某一個像素值呢,對於數據為uchar類型的Mat對象,可以直接用data訪問和修改,對於數據為float或double類型的Mat對象,我們同樣可以用data對圖像的某個像素值進行訪問和修改操作,方法就是將data強制轉換成指向Mat對象對應數據類型的指針。例如我們創建一個10x10的CV_8UC1的Mat對象,將其每個元素都賦值為10(int),然后輸出每個元素的值,這里我們用data進行相關操作,代碼和運行結果如下:
1 #include<iostream> 2 #include<opencv2/opencv.hpp> 3 4 using namespace std; 5 using namespace cv; 6 7 int main() { 8 Mat img(10,10,CV_8UC1); 9 10 for (int i=0;i<img.rows;i++) 11 { 12 for (int j=0;j<img.cols;j++) 13 { 14 int* data = (int*)img.data; 15 data[i] = 10; 16 } 17 } 18 if (img.isContinuous()) { 19 for (int i = 0; i < img.rows; i++) 20 { 21 for (int j = 0; j < img.cols; j++) 22 { 23 int* data = (int*)img.data; 24 cout << data[i] << " "; 25 } 26 } 27 } 28 29 system("pause"); 30 return 0; 31 }