多維 opencv Mat訪問
你看完這篇文章之後,將學會以下知識:
① 二維、三維、四維等任意維度的Mat的常用建立方法;
② 任意維度Mat中值的索引;
③ 以及一些Mat常用的操作。
下面是對各維度矩陣的介紹:
注意:下面的操作只是我常用的操作方法,不是唯一的方法,對於那些沒有思路的同學,下面的內容希望起到拋磚引玉的效果。
我以單通道的uchar型別的圖片做例子
1. 二維Mat
二維的Mat是我們最常使用的型別,它就和我們的圖片直接對應
建構函式:Mat(int rows, int cols, int type, const Scalar& s);
變數宣告:cv::Mat mat2D(100, 100, CV_8UC1, cv::Scalar(0));
1
2
上述變數宣告的程式碼,定義了一個100x100的Mat,它有一個通道,通道中的資料型別都是uchar,每一個對應位置的值都是0。
對於這種二維矩陣的索引,有多種方法:
第一種(效率不高)
uchar a = mat2D.at<uchar>(i,j)
1
第二種
uchar* a = mat2D.ptr<uchar>(0);//指標指向mat2D的0行首地址
uchar a = mat2D.ptr<uchar>(1)[5];//取出(1,5)中的值
1
2
2. 三維Mat
三維Mat一般很少用,對於它的操作:
建構函式:Mat(int ndims, const int* sizes, int type);
變數宣告:
int size[3] = {100, 100, 100};
cv::Mat mat3D(3, size, CV_8UC1, cv::Scalar(0));
1
2
3
4
5
上面變數宣告的程式碼,宣告瞭一個維度為3,大小為100x100x100的Mat。
對於三維Mat的索引:
第一種方法(效率不高)
uchar a = mat3D.at<uchar>(4,5,6);//取出(4,5,6)中對應的值
1
第二種方法
uchar* a = mat3D.ptr<uchar>(0,0);//a指向前兩維限定下的行首的地址
uchar a = mat3D.ptr<uchar>(0,0)[4];//取出(0,0,4)中的值
1
2
3. 四維Mat
int size[4] = {100, 100, 100, 100};
cv::Mat mat4D(4, size, CV_8UC1, cv::Scalar(0));
1
2
對於四維Mat的索引,不能使用at函式,因為不支援超過三維的Mat
uchar* a = mat3D.ptr<uchar>(0,0,0)[4];//取出(0,0,0,4)中對應的值
1
4. 五維Mat
int size[5] = {100, 100, 100, 100, 100};
cv::Mat mat5D(5, size, CV_8UC1, cv::Scalar(0));
1
2
大於四維的Mat,既不能使用at,也不能使用ptr訪問元素。下面介紹我常用的方法:這裡我們可以使用Mat類中的data成員變數,它指向Mat資料區的首地址,對於Mat型別的資料,它們是按照線性方式存值的,我們知道首地址之後,就可以通過指標偏移的方式,去索引任意元素的值。
對於 100x100x100x100x100 的五維Mat,如果索引要 [a,b,c,d,e] 中的值,則可以使用下面的方式
uchar a = *(mat5D.data + a*100*100*100*100 + b*100*100*100 + c*100*100 + d*100 + e);
1
如果你在Mat中儲存的不是CV_8UC1,而是別的型別,比如是CV_32FC1,那麼就不能直接使用data,因為它預設是uchar型別的指標,需要將它強轉為float型別。程式碼如下:
float a = *((float*)mat5D.data + a*100*100*100*100 + b*100*100*100 + c*100*100 + d*100 + e);
1
對於更高維的情況,使用上面的五維的方法推廣就行,當然上述所有的方法,都不是最好的或者是唯一的,只是我個人比較常用的。
相關文章
- 【OpenCV】訪問Mat影象中每個畫素的值OpenCV
- opencv mat轉IplImage*OpenCV
- OpenCV(cv::Mat::setTo())OpenCV
- OpenCV(cv::Point、cv::Rect、cv::Mat)OpenCV
- opencv的Mat類詳解以及mannal翻譯OpenCV
- OpenCV翻譯專案總結二——Mat翻譯OpenCV
- OpenCV(cv::Mat 類的成員函式 ptr<T>())OpenCV函式
- 【C++】【OpenCV-4.9.0】灰度圖取反(Mat屬性的使用)C++OpenCV
- C++之OpenCV入門到提高004:Mat 物件的使用C++OpenCV物件
- 【OpenCV】幾種Mat類拷貝複製方法對比_親測有效OpenCV
- opencv多邊形逼近OpenCV
- gite多個賬號 訪問倉庫Git
- Tomcat6.0 配置多埠訪問Tomcat
- 【Python】【OpenCV】定位二維碼PythonOpenCV
- 多個人訪問實體Bean,這個Bean訪問幾次資料庫啊?Bean資料庫
- 【磐維資料庫】透過python訪問磐維資料庫資料庫Python
- K8S- 配置多叢集訪問K8S
- 網站訪問速度慢運維如何排查?Linux運維技術網站運維Linux
- 關於多執行緒訪問靜態方法的問題執行緒
- PHP 設定多域名允許跨域訪問PHP跨域
- 手機訪問電腦本地多個網站網站
- 使用PowerBuilder同時訪問多個資料庫UI資料庫
- Mat使用詳解
- MAT使用入門
- 一個物件多處引用的維護問題物件
- 《使用者思維+》作者Kathy Sierra訪談問題有獎徵集(圖靈訪談)圖靈
- 一維多維陣列陣列
- 在Oracle裡設定訪問多個SQL Server(轉)OracleSQLServer
- 【磐維資料庫】Oracle(透明閘道器)訪問磐維資料庫(PanWeiDB)資料庫Oracle
- 雙目測距與三維重建的OpenCV實現問題集錦(四)三維重建與OpenGL顯示OpenCV
- Java多執行緒/併發12、多執行緒訪問static變數Java執行緒變數
- 多維陣列轉一維陣列(降維的多種方式)陣列
- 多維度分片需求,如何解決查詢問題?
- 錯誤思維導向致IT專案問題多
- 訪問統計(排除爬蟲訪問)爬蟲
- 7.73 DATAOBJ_TO_MAT_PARTITIONOBJ
- Buffer 與 Mat 互轉
- QImage 與 Mat 互轉