Я думаю, что самый простой путь IS opencv для того, что вы хотите сделать.
Есть ссылка о «более простых» вещах: http://media.packetlife.net/media/blog/attachments/413/nbar_flesh_tone.html(Если у вас есть сервер Cisco, на котором вы хотите расставить приоритеты для изображений не телесного цвета.)
Этот поток Обнаружение обнаженного изображения - OPENCV Ссылки на: https://csel.cs.colorado.edu/~xingx/project/privacy.html (без кода, исследование по обнаружению «ню» видео.)
Вы можете взглянуть на книгу O'reilly Opencv.Там объясняется пример цветового пространства hsv для телесного цвета.Эта книга объясняет это хорошо.(При поиске доступно несколько страниц книг Google.)
Вы также можете посмотреть пример camshift opencv.
Это ссылка на проблемное пространство в opencv.(Если вам нужен какой-то код или вы читаете немного об использовании цветового пространства HSV или CIE L a b * цветовое пространство) http://tech.groups.yahoo.com/group/OpenCV/message/45158
Некоторый код скопирован из той группы opencv, которая даетмаска для «телесного цвета»:
src_RGB = RGB-Image (IPL_DEPTH_8U , 3); // Source
mask_BW = GRAY-Image (IPL_DEPTH_8U , 3);// Resulting Mask same size as source !!
//after GetSkinMask you can use cvAnd between src_RGB and mask_BW.
void GetSkinMask(IplImage * src_RGB, IplImage * mask_BW, int
erosions=1, int dilations=7)
{
CvSize size;
CvSize sz = cvSize( src_RGB->width & -2, src_RGB->height & -2);
//get the size of input_image (src_RGB)
IplImage* pyr = cvCreateImage( cvSize(sz.width/2, sz.height/2), 8, 3 ); //create 2 temp-images
IplImage* src = cvCreateImage(cvGetSize(src_RGB), IPL_DEPTH_8U ,3);
cvCopyImage(src_RGB, src);
IplImage* tmpYCR = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U , 3);
cvPyrDown( src, pyr, 7 );
//remove noise from input
cvPyrUp( pyr, src, 7 );
cvCvtColor(src ,tmpYCR , CV_RGB2YCrCb);
uchar Y;
uchar Cr;
uchar Cb;
CvPixelPosition8u pos_src;
CvPixelPosition8u pos_dst;
int x =0;
int y =0;
CV_INIT_PIXEL_POS(pos_src,(unsigned char *) tmpYCR->imageData,
tmpYCR->widthStep, cvGetSize(tmpYCR), x,y, tmpYCR->origin);
CV_INIT_PIXEL_POS(pos_dst, (unsigned char *) mask_BW->imageData,
mask_BW->widthStep, cvGetSize(mask_BW), x,y, mask_BW->origin);
uchar * ptr_src;
uchar * ptr_dst;
for( y=0;y<src-> height; y++)
{
for ( x=0; x<src->width; x++)
{
ptr_src = CV_MOVE_TO(pos_src,x,y,3);
ptr_dst = CV_MOVE_TO(pos_dst,x,y,3);
Y = ptr_src[0];
Cb= ptr_src[1];
Cr= ptr_src[2];
if( Cr > 138 && Cr < 178 &&
Cb + 0.6 * Cr >200 && Cb + 0.6 * Cr <215)
{
ptr_dst[0] = 255;
ptr_dst[1] = 255;
ptr_dst[2] = 255;
}
else
{
ptr_dst[0] = 0;
ptr_dst[1] = 0;
ptr_dst[2] = 0;
}
}
}
if(erosions>0) cvErode(mask_BW,mask_BW,0,erosions);
if (dilations>0) cvDilate(mask_BW,mask_BW,0,dilations);
cvReleaseImage(&pyr);
cvReleaseImage(&tmpYCR);
cvReleaseImage(&src);
}