補充一篇最近使用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...