从肤色识别到手势识别

首先附上一段肤色识别的代码

#include 
#include 

#include 
#include 
#include 
#include 
#include 

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 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;
}

代码功能非常简略,归结为从摄像头读出视频帧以后,对每一帧的图片进行肤色检测。
肤色检测的核心内容体现为:针对黄种人的 肤色值范围对每帧图片的三个通道图像进行分离,符合人体颜色的像素点标记为白色,不符合的标记为黑色,这样有利于下一步人手的位置获取和手的姿势获取。


从肤色识别到手势识别_第1张图片

你可能感兴趣的:(从肤色识别到手势识别)