Mat類下的data指針的深刻理解


摘要:本文主要介紹了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 }


免責聲明!

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



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