OpenCV Mat類矩陣元素訪問

2021-06-12 13:56:24 字數 1658 閱讀 1503

補充一篇最近使用opencv的學習,關於處理和人臉檢測的函式呼叫。上次部落格中寫了使用最新版本2.4.3中,haar detection執行正常,但是無法找到任何人臉。最近使用了新的c++類的函式呼叫,不再用cvrelease...,但是仍舊只有lbp detection工作正常,所以使用了lbp。相信大多人和我一樣檢測人臉之後用於其它研究分析,並不注重哪個檢測率和速度更優,鑽研視覺領域的人應該都會自己編寫**來用了吧。

以下**摘自官方示例:

不過檔案換成了lbp cascade

string face_cascade_name = .../lbpcascades/lbpcascade_frontalface.xml";

cascadeclassifier face_cascade;

if( !face_cascade.load( face_cascade_name ) );

face_cascade.detectmultiscale( frame_gray, faces, 1.1, 2, 0|cv_haar_scale_image, size(30, 30) );  //裡返回的結果是乙個由vector組成的陣列faces。如果檢測到多個結果,通常陣列裡最後一張最大的是人臉。

接下來主要說下最近使用mat.at<>()的一點注意事項。之前因為處理值訪問矩陣主要用最新的mat類,但是訪問卻總是報異常。主要用的是8bit graylevel圖。明知道裡面是int,卻總是錯誤。於是被動下轉換成舊的cvmat,用間接訪問方法處理,極其繁瑣。   更改乙個矩陣式histogram裡數值的大小。

cvmat cvmat = mat;

cvscalar scal = cvget2d(histogram,i,j);

scal.val[0]++;

cvset2d(histogram,i,j,scal);

最近有空再優化**時又研究了下,雖然明知資料型別為int存放,但是必須符合mat.at所用的格式,只是integer就分成了很多種。

cv_8u

- 8-bit unsigned integers ( 

0..255

)cv_8s

- 8-bit signed integers ( 

-128..127

)cv_16u

- 16-bit unsigned integers ( 

0..65535

)cv_16s

- 16-bit signed integers ( 

-32768..32767

)cv_32s

- 32-bit signed integers ( 

-2147483648..2147483647

)試了下發現32bit長整形才能正常呼叫mat.at函式直接讀寫操作,所以使用mat.c

onvertto來設定成指定格式。順便說下當初始設定mat後再imread,格式會變化。並且初始化時設初值為0的話列印出來為空。所以我用了mat.setto來初始全0的,zeros應該專門做這個用,不過沒有試。但這一點在文件中並沒有找到說明。

最後想吐槽的是opencv中提供了lbp cascade和face recognizer,卻沒有說明如何順便匯出特徵和一些引數設定,有待開發提高。opencv中的svm分類器輸入預設是個mat,不過一行為乙個單位向量。類別編好也是個n行1列的mat,要使用的朋友在編寫自己的特徵抓取**中可以注意下。

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

opencv裡,mat影象的畫素訪問跟iplimage型別有所不同。iplimage型別與mfc影象處理相似。畫素指標加上記憶體位移即可表示影象畫素。在mfc中 for i 0 i mat本質上是由兩個資料部分組成的類 包含資訊有矩陣的大小,用於儲存的方法,矩陣儲存的位址等 的矩陣頭和乙個指標。指標...

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矩陣的合併與拼接

opencv有自帶函式 vconcat和hconcat函式,用於矩陣的合併與影象的拼接。vconcat b,c,a 等同於a b c 上下疊加 hconcat b,c,a 等同於a b c 左右疊加其實不用這兩個函式,在c 中也可以自己輕鬆實現mat矩陣的合併 mat posmat mat zero...