- 色彩空間轉換 - HSI 與 YCbCr
- 皮膚偵測
- 一句話收尾
第一部分 - 色彩空間轉換 - HSI 與YCbCr
以下曝本人照,選此當原圖,是因為顏色與背景十分複雜。
(自宅警備員)
首先轉換HIS到空間
// Cache double divide_255 = 1.f/255.f; double divide_3 = 1.f/3.f; double divide_360 = 1.f/360.f; // RGB cache double pR = (double)*(pixel_data + 2), pG = (double)*(pixel_data + 1), pB = (double)*(pixel_data); // BGR double R = pR * divide_255, G = pG * divide_255, B = pB * divide_255; // Compute pixel value for HSI image double diffRG = R-G, diffRB = R-B, diffGB = G-B; double tempI = (R + G + B) * divide_3; double tempS = 1.f - min(R, min(G, B)) / tempI; double H_normal = acos(0.5*(diffRG + diffRB) / sqrt(diffRG*diffRG + diffRB*diffGB)) * divide_360; double temp_H = (B > G) ? 1.f - H_normal : H_normal;
這邊注意,我是直接照順序放入H. S. I,而沒有刻意像RGB倒轉成BGR。
H圖 - Hue Channel
參考其他同學的結果,投影片公式的根號處好像有錯,此為更正公式的結果。
另外,測試其他圖片,Hue的計算結果跟同學結果不一致,
檢查好幾遍程式碼,抓不出BUG...,有空再做詳細地比對orz。
S圖-Saturation
再來轉到YCbCr空間,為了後續皮膚偵測判斷用
// Compute pixel value for YCbCr image double Y = 0.257*pR + 0.504*pG + 0.098*pB + 16.f; double Cb = -0.148*pR - 0.291*pG + 0.439*pB + 128.f; double Cr = 0.439*pR - 0.368*pG - 0.071*pB + 128.f;
第二部分 - 皮膚偵測
// Control panel to choose condition range namedWindow( "Control panel", CV_WINDOW_AUTOSIZE ); int iY_min = 100; createTrackbar("Y_min", "Control panel", &iY_min, 255); int iCb_min = 105; createTrackbar("Cb_min", "Control panel", &iCb_min, 255); int iCb_max = 135; createTrackbar("Cb_max", "Control panel", &iCb_max, 255); int iCr_min = 135; createTrackbar("Cr_min", "Control panel", &iCr_min, 255); int iCr_max = 173; createTrackbar("Cr_max", "Control panel", &iCr_max, 255); ... if(Y > (uchar)iY_min && ((Cb > (uchar)iCb_min && Cb < (uchar)iCb_max) && (Cr > (uchar)iCr_min && Cr < (uchar)iCr_max))) ...
對於太多TrackBar占掉畫面大半,造成不方便檢查輸出圖片的狀況,這邊發現一個小技巧,
新增一個專門處理TrackBar的空視窗(不輸出圖片),
就會變成像Control Panel一樣,與輸出圖片分離,操作十分方便。
皮膚偵測的範圍條件參考上面的程式碼,
就結果來說,除了臉部皮膚,其他不太理想。
周遭太多與皮膚顏色相近的物體,造成雜訊殘留眾多。
而手臂因拍照時受光,造成變色,被判斷不是皮膚。
如果放寬條件,讓手臂能被判斷是皮膚,則背後的牆壁也會被納入。
一句話收尾
能應用很多上課的技巧做改進,期末的時間因素,只能點到此為止了......
沒有留言:
張貼留言