Я новичок в распознавании изображений и EmguCV.Я хочу обнаружить руку в кадрах изображения, снятых веб-камерой, предпочтительно в двоичном виде, и в идеале удалить весь фон из самой рамки.
Я пробовал несколько каскадов Хаара, но недавно я узнал, что каскады Хааратолько обучены определять конкретные положения рук, он не может обнаружить «любой» жест руки.Итак, я сейчас изучаю способы извлечения человеческой кожи из рамы (я преуспел в этой части), а затем извлекаю из нее руки.Проблема в том, что я дал диапазон цветов для кода обнаружения, но, поскольку он перекрывается со многими другими объектами, такими как стены, мне нужна помощь в удалении этих частей.Более того, в идеале, я также хотел бы снять с себя другие части тела, такие как лицо, оставив с чистым двоичным изображением руки.
Вот код, который у меня есть для обнаружения кожи, взят из 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
И вотисходное изображение, к которому были применены 2 вышеуказанных фильтра: http://prntscr.com/nmvg47
Обратите внимание, как я пытаюсь избежать того, чтобы камера сама держала руку в руках, и вижу, как объекты потолка также захватываются как кожа.