EmguCV中的手部分割

时间:2019-05-10 15:26:24

标签: c# opencv emgucv

我是图像识别和EmguCV的新手。我想检测摄像头捕获的图像帧中的手,最好是二进制形式,并理想地从帧本身中删除所有背景。

我已经尝试了多个Haar级联,但是最近我才知道Haar级联只经过训练可以检测特定的手部位置,而不能检测到手的“任何”手势。因此,我现在正在研究从框架中提取人类皮肤的方法(我在这一部分已经成功完成),然后从框架中提取手。问题是,我给检测代码指定了肤色范围,但是由于它与许多其他对象(例如墙壁)重叠,因此需要一些帮助来移除这些部分。而且,理想情况下,我还希望剥离其他身体部位,例如脸部,留下纯正的二进制图像。

这是我从http://blog.csdn.net/scyscyao/archive/2010/04/09/5468577.aspx抓取的用于皮肤检测的代码

public Image<Gray, byte> DetectSkin(Image<Bgr, byte> img)
{
    Image<Ycc, byte> currentYCrCbFrame = img.Convert<Ycc, byte>();
    Image<Gray, byte> skin = new Image<Gray, byte>(img.Width, img.Height);

    int y, cr, cb, l, x1, y1, value;

    int rows = img.Rows;
    int cols = img.Cols;
    byte[,,] YCrCbData = currentYCrCbFrame.Data;
    byte[,,] skinData = skin.Data;

    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++)
        {
            y = YCrCbData[i, j, 0];
            cr = YCrCbData[i, j, 1];
            cb = YCrCbData[i, j, 2];

            cb -= 109;
            cr -= 152;
            x1 = (819 * cr - 614 * cb) / 32 + 51;
            y1 = (819 * cr + 614 * cb) / 32 + 77;
            x1 = x1 * 41 / 1024;
            y1 = y1 * 73 / 1024;
            value = x1 * x1 + y1 * y1;
            if (y < 100)
                skinData[i, j, 0] = (value < 700) ? (byte)255 : (byte)0;
            else
                skinData[i, j, 0] = (value < 850) ? (byte)255 : (byte)0;
        }
    }
    // Below 3 lines attempt to remove the extra objects a little bit but fails to do s0
    Mat rect_6 = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, new Size(6, 6), new Point(3, 3));
    CvInvoke.Erode(skin, skin, rect_6, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Reflect, default(MCvScalar));
    CvInvoke.Dilate(skin, skin, rect_6, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Reflect, default(MCvScalar));
    return skin;
}

这是没有最后3行的结果: http://prntscr.com/nmvf8n

以下是最后3行的结果: http://prntscr.com/nmvflp

这是上面应用了两个滤镜的原始图像: http://prntscr.com/nmvg47

请注意如何避免自己独自握住相机,以及如何将天花板物体也捕捉为皮肤。

0 个答案:

没有答案