任何易于使用的服务器端肉体搜索器/工具?

时间:2011-04-26 18:59:39

标签: opencv find image

我们需要接受图片作为输入,然后在原始图像中的“肉体”部分上方操作/叠加图像数据。

有没有人处理过简单的技术来促进这种过程?已阅读有关OpenCV的内容,但我希望有更简单的方法。

1 个答案:

答案 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);
}