我们需要接受图片作为输入,然后在原始图像中的“肉体”部分上方操作/叠加图像数据。
有没有人处理过简单的技术来促进这种过程?已阅读有关OpenCV的内容,但我希望有更简单的方法。
答案 0 :(得分:1)
对于您想要做的事情,我认为最简单的路径是开放。
有一个关于'更简单'的东西的链接: http://media.packetlife.net/media/blog/attachments/413/nbar_flesh_tone.html (如果您有想要优先处理非肉色图像的思科服务器。)
这个帖子 Nude image detection - OPENCV 链接到:https://csel.cs.colorado.edu/~xingx/project/privacy.html (没有代码,研究视频'裸'检测。)
你可以看一下O'reilly Opencv书。有一个hsv颜色空间的例子,在那里解释肉色。这本书解释得很好。 (如果您搜索,可以使用一些谷歌书页。)
您还可以查看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);
}