● YCbCr
Y = 0.299*data[2] + 0.587*data[1] + 0.114*data[0];● Normal RGB
Cb = -0.1687*data[2] - 0.3312*data[1] + 0.5*data[0];
Cr = 0.5*data[2] - 0.4183*data[1] - 0.0816*data[0];
if(60 < Y && Y < 255)
{
if(-25 < Cb && Cb < 0)
{
if(10 < Cr && Cr < 45)
{
// skin
}
else
{
// non-skin
}
}
else
{
// non-skin
}
}
else
{
// non-skin
}
double r;
double g;
double b;
double F1;
double F2;
double w;
int size = 320*240;
Byte* data = (Byte*)scan0.ToPointer();
for(int i = 0; i < size; ++i, data += 3)
{
if(data[0] == 0 && data[1] == 0 && data[2] == 0)
{
r = g = b = 0;
}
else
{
r = (double)data[2]/(data[2]+data[1]+data[0]);
g = (double)data[1]/(data[2]+data[1]+data[0]);
}
F1 = -1.3767*r*r + 1.0743*r + 0.1452;
F2 = -0.776*r*r + 0.5601*r + 0.1766;
w = (r-0.33)*(r-0.33) + (g-0.33)*(g-0.33);
if((g < F1) && (g > F2) &&
(w > 0.0004) &&
(data[2] > data[1]) &&
(data[1] > data[0]) &&
(data[2] - data[1] >= 16))
{
// skin
}
else
{
// non-skin
}
}
後者是我目前用過效果最好的膚色模型,在白光或者黃光的環境都表現得不錯。但是,不論多麼好的膚色模型,想要應付各種外在因素的影響,還是顯得不足,畢竟拿到的影像,顏色都被干擾了。
相關閱讀:
1 則留言:
Normalize-RGB用了許多乘除法,所以很耗CPU
張貼留言