opencv Mat元素訪問和Mat矩陣初始化

2021-07-02 15:58:52 字數 2047 閱讀 4395

opencv裡,mat影象的畫素訪問跟iplimage型別有所不同。

iplimage型別與mfc影象處理相似。畫素指標加上記憶體位移即可表示影象畫素。

在mfc中:

for(i=0;i

mat本質上是由兩個資料部分組成的類: (包含資訊有矩陣的大小,用於儲存的方法,矩陣儲存的位址等) 的矩陣頭和乙個指標。

指標指向包含了畫素值的矩陣(可根據選擇用於儲存的方法採用任何維度儲存資料)。矩陣頭部的大小是恆定的。然而,矩陣本身的大小因影象的不同而不同,通常是較大的數量級。因此,當你在您的程式中傳遞影象並在有些時候建立影象副本您需要花費很大的代價生成影象矩陣本身,而不是影象的頭部。 

這樣在opencv裡,mat的每個物件具有其自己的頭,但可能他們通過讓他們矩陣指標指向同一位址的兩個例項之間共享該矩陣。此外,拷貝運算子將只能複製矩陣頭部,也還將複製指向矩陣的指標,但不複製矩陣本身。 

1.mat a, c; //僅建立了頭部 

2.a = imread(argv[1], cv_load_image_color); //在此我們知道使用的方法(分配矩陣) 

3.mat b(a); //使用拷貝建構函式 

4.c = a; //賦值運算子 

上文中的所有物件,使用同乙個資料矩陣。他們的頭不同,但是其中任何乙個對矩陣進行修改,都會將影響所有其他的矩陣。 

單通道灰度圖資料存放格式:

多通道的影象中,每列並列存放通道數量的子列,如rgb三通道彩色圖: 

注意通道的順序反轉了:bgr 

通常情況記憶體足夠大的話影象的每一行是連續存放的,也就是在記憶體上影象的所有資料存放成一行,這中情況在訪問時可以提供很大方便。可以用 iscontinuous() 函式來判斷影象陣列是否為連續的。 

第一:遍歷影象先行後列,每行定義乙個指標,然後在記憶體上直接連續訪問。

}

還有:

uchar* p=binimage.data;

for(int i=0;i100)

*p=0;

else

*p=255;

*p++;

}

若是rgb彩色影象

mat& scanimageandreducec(mat& i, const uchar* const table)

int i,j;

uchar* p;

for( i = 0; i < nrows; ++i) }

return i;

}

第二種 先列後行,定義指向整個影象的指標。

cv::mat imbottom;

int channle = imbottom.channels();

uchar *datar = imbottom.data; //

/*//對於單通道影象可以直接這樣訪問

for(unsigned int i=0; i先列後行方法在上下影象拼接中會用到。平時因為習慣問題還是少用。

mat矩陣初始化

//用乙個一維陣列來初始化矩陣

void initmat(mat& m,float* num)

主程式:

int main()

; mat m0(3,3,cv_32f);

initmat(m0,m0);

}

OpenCV Mat類矩陣元素訪問

補充一篇最近使用opencv的學習,關於處理和人臉檢測的函式呼叫。上次部落格中寫了使用最新版本2.4.3中,haar detection執行正常,但是無法找到任何人臉。最近使用了新的c 類的函式呼叫,不再用cvrelease.但是仍舊只有lbp detection工作正常,所以使用了lbp。相信大多...

Opencv Mat元素操作

opencv的mat中元素操作有好幾種方式 opencv中mat是row優先儲存的 mat h 100,100,cv 64f for int i 0 i h.rows i for int j 0 j h.cols j h.at i,j 1.i j 1 2維情況為 在matrix維度比較大時,兩個的訪...

opencv Mat 求元素 中值 均值 總和

搜尋和很久,還是沒有發現求mat 內元素的中值函式,於是自己寫了乙個 float median mat 32f mat img qsort buf,3,sizeof buf 0 comp return buf img.rows img.cols 2 資料型別不確定,於是又想起了寫乙個模板 上 比較兩...