在对物体做初步检测时,颜色信息非常有用。如可用来检测皮肤的颜色,检测到的皮肤区域可作为图像中有人存在的标志。在手势识别中经常使用这个方法,用肤色检测来确定手的位置。
在下面的例子中,我们将使用色调和饱和度来识别肤色,定义一个基于数值区间(最小和最大色调,最小和最大饱和度)的函数,把图像中的像素分为皮肤和非皮肤两类:
完整代码如下:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void detectHcolor(const Mat &image, //输入图像
double minHue,double maxHue, //色调(Hue)区间
double minSat,double maxSat, //饱和度(saturation)区间
Mat &mask) //输出掩码
{
Mat hsv;//转换到HSV空间
cvtColor(image, hsv, CV_BGR2HSV);//将图像从一个色彩空间转换为另一个色彩空间
std::vector<Mat>channels;//分割3个通道,并存进3个图像
split(hsv, channels);//channels[0]是色调
//channels[1]是饱和度
//channels[2]是亮度
//色调掩码
Mat mask1;//小于maxHue
threshold(channels[0], mask1, maxHue, 255, THRESH_BINARY_INV);
Mat mask2;//大于minHue
threshold(channels[0], mask2, minHue, 255, THRESH_BINARY);
Mat hueMask;//色调掩码
if (minHue<maxHue)
hueMask=mask1&mask2;
else //如果区间穿越0度中轴线
hu