openCV转换颜色空间,建立人体肤色模型


台湾人的blog,ms是
http://finalevil.blogspot.com/search/label/0.4%EF%BC%9A%E7%A8%8B%E5%BC%8F-OpenCV%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98
 

[Introduction]I find some questions when using opencv today.The color-space convert function cvCvtColor seems problematic. I'm not sure.But when I convert the RGB to YCrCb,the result has error.

今天在寫一個很單純的Skin color modal,
用數學模型替人的皮膚顏色建立可以判斷的標準,這個顏色是人的皮膚 or 不是人的皮膚?
有各式各樣的方法來建立此一數學模型。

像是這篇用Gussian Modal(高斯分佈模型)
Face detection in color images using AdaBoost algorithm based on skin color information
來解釋皮膚的顏色分布。

或是這篇
Fuzzy System Learned Through Fuzzy Clustering and Support Vector Machine for Human Skin Color Segmentation
用Fuzzy和Support Vector Machine來切割出圖片中屬於人類皮膚的部分。

但是,這些方法都過於複雜容易影響整個人臉偵測與辨識的效率,造成人臉偵測無法在即時系統運作的問題。所以目前不考慮這些較為複雜的數學模型。

依照這篇論文的做法
Face Detection in Color Images using Wavelet Packet Analysis
我嘗試暫時先用簡單的不等式來替代膚色的截取。不等式內容如下:
 

關於OpenCV的重點來了 = =

我要先將RGB的色彩轉換到對光照亮度比較不敏感的YCrCb空間,所以我直接使用OpenCV的cvCvtColor方法,但是我得到的結果卻與論文上轉換色彩空間的方法不一樣。
同樣是YCrCb難道有第二種算法?!!
因此找出來的膚色位置都不是正確的。

參考OpenCV中文論壇
對cvCvtColor的空間轉換是這樣解釋的
Y=0.299*R + 0.587*G + 0.114*B
Cr=(R-Y)*0.713 + 128
Cb=(B-Y)*0.564 + 128


但是我出來的問題卻是上面的公式不對,
我後來改用另一篇論文提供的公式如下:


雖然我覺得OpenCV在色彩空間轉換的function似乎有問題,但還是說明一下怎麼使用,
有興趣的朋友可以踹踹看,是不是正常work

記得先用cvLoadImage載入圖片到pImg
//建立三個單通道的圖片指標
IplImage* pCh[3];
for(int i=0;i<3;i++)
    pCh[i]=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1);

//實際將pImg鐘的圖片,轉換到YCrCb色彩空間,並存在pYcc裡面
cvCvtColor(pImg,pYcc,CV_BGR2YCrCb);

//最後,我們可以把pYcc裡面有Y,Cb,Cr三個通道的資料,分解開來,
//存到pCh[0],pCh[1],pCh[2]
cvSplit(pYcc,pCh[0],pCh[1],pCh[2],0);

所以pCh[0],pCh[1],pCh[2]分別表示Y,Cr,Cb的數值。

總之最後有結果囉。以下是原圖:
 

下圖保留了被認定是膚色的部分:



結論:使用OpenCV的時候請小心,他也許不是錯的,但可能不是你要的。

你可能感兴趣的:(openCV转换颜色空间,建立人体肤色模型)