基于OpenCv的(YCrCb)颜色空间的肤色检测

                                                                  基于OpenCv的(YCrCb)颜色空间的肤色检测

    摘要:颜色空间分为RGB,HSV,YUV等,此次主要是以YCrCb颜色空间的肤色检测。利用YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视的特点,将摄像头捕捉到的图像转换成黑白图像(即皮肤颜色为白色以外,其他颜色为黑色)。


   关键词:

   YUV空间:               

 一、 YUV即YCrCb,是被欧洲电视系统所采用的一种颜色编码方法。

   YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。

 “Y”:表示明亮度(Luminance或Luma),即灰阶值;

 “U”和“V”: 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

 “亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。

 “色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。

     Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。

     Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异。

二、实验分为三个步骤,部分代码如下:

(1)打开摄像头,判断摄像头是否打开

      {
VideoCapture capture(0);//0代表的是打开笔记本中的摄像头,1则代表的是外接的相机

if (!capture.isOpened())//判断摄像头是否已打开
{
return -1;
}


(2)转换颜色空间,分割颜色通道

                cvtColor(tmp, tmp, CV_BGR2YCrCb);//转换颜色空间为YUV(第一个tmp为读入的图像,第二个为转化成YUV的图像)
split(tmp, channels);//把图像tmp分割为单通道
Y = channels.at(0);//Y为明度
Cr = channels.at(1);//Cr为色调
Cb = channels.at(2);//饱和度
            

(3)遍历图像
for (int j = 1; j < Y.rows - 1; j++)
{
uchar* currentCr = Cr.ptr< uchar>(j);//uchar根据图像数据的类型来的
uchar* currentCb = Cb.ptr< uchar>(j);
uchar* current = result.ptr< uchar>(j);
for (int i = 1; i < Y.cols - 1; i++)
{
if ((currentCr[i] > 145) && (currentCr[i] < 197) && (currentCb[i] > 105) && (currentCb[i] < 118))
current[i] = 255;//将阈值范围的像素设为255
else
current[i] = 0;//其余为0
}
}


三、运行结果如下:



猜你喜欢

转载自blog.csdn.net/HHCCWWlxy/article/details/80023844