首先附上一段肤色识别的代码
#include <iostream>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return -1;
}
namedWindow("result");
namedWindow("frame");
Mat frame;
Mat result, tmp;
Mat Y, Cr, Cb;
vector<Mat> channels;
bool stop = false;
cap >> frame;
while (!stop)
{
cap >> frame; //读取视频帧
frame.copyTo(tmp); //拷贝备份
//转换颜色空间并分割颜色通道
cvtColor(tmp, tmp, CV_BGR2YCrCb);
//split函数的主要功能是把一个彩色图像分割成3个通道,方便进一步的图像处理
split(tmp, channels);
Y = channels.at(0);
Cr = channels.at(1);
Cb = channels.at(2);
result.create(frame.rows, frame.cols, CV_8UC1);
//遍历图像,将符合阈值范围的像素设置为255,其余为0
for (int j = 1; j < Y.rows - 1; j++)
{
uchar* currentCr = Cr.ptr< uchar>(j);
uchar* currentCb = Cb.ptr< uchar>(j);
uchar* current = result.ptr< uchar>(j);
for (int i = 1; i < Y.cols - 1; i++)
{
if ((currentCr[i] > 137) && (currentCr[i] < 175) && (currentCb[i] > 100) && (currentCb[i] < 118))
current[i] = 255;
else
current[i] = 0;
}
}
imshow("frame", frame);
imshow("result", result);
if (waitKey(30) >= 0)
stop = true;
}
cv::waitKey();
return 0;
}
代码功能非常简略,归结为从摄像头读出视频帧以后,对每一帧的图片进行肤色检测。
肤色检测的核心内容体现为:针对黄种人的 肤色值范围对每帧图片的三个通道图像进行分离,符合人体颜色的像素点标记为白色,不符合的标记为黑色,这样有利于下一步人手的位置获取和手的姿势获取。

网友评论