Любые готовые к использованию на стороне сервера алгоритмы / инструменты искателя флеш-памяти? - PullRequest
1 голос
/ 26 апреля 2011

Нам необходимо принять изображения в качестве входных данных, а затем манипулировать / накладывать данные изображения над разделами «плоти» в исходном изображении.

Кто-нибудь имел дело с простыми технологиями, облегчающими этот вид процесса?Читал об OpenCV, но надеюсь, что есть более легкий путь.

1 Ответ

1 голос
/ 09 мая 2011

Я думаю, что самый простой путь 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...