Как получить доступ к пикселю лица на определенном лице из изображения? - PullRequest
1 голос
/ 26 октября 2011

Я использую исходный код на nashruddin.com, чтобы нарисовать прямоугольник на обнаруженном лице из живого видеопотока с моей веб-камеры.

Я хочу изменить лицо или весь прямоугольник как черный цвет.Я попытался использовать решения с этой страницы: http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000

однако я не могу получить лицо или прямоугольник, чтобы стать черным.

Что я на самом деле пробовал, один из примеров выглядит следующим образом:

//do the capture frame all those

 for( int i = 0 ; i < ( faces ? faces->total : 0 ) ; i++ ) {

 CvRect *r = ( CvRect* )cvGetSeqElem( faces, i );        
 cvRectangle( frame,
              cvPoint( r->x, r->y ),
              cvPoint( r->x + r->width, r->y + r->height ),
              CV_RGB( 255, 0, 0 ), 1, 8, 0 );

 int x=r->x;

 int y=r->y;

 int width=r->width;

 int height=r->height;

 for(int i=x; i<=height; i++){

 for(int j=y; j<=width; j++){

 //data[i*step+j*channels+0] = 0;//3=yellow; 2=blue; 1=purple;

((unsigned char *)(frame->imageData + i*frame->widthStep))[j*frame->nChannels + 0]=0;// B 

((unsigned char *)(frame->imageData + i*frame->widthStep))[j*frame->nChannels + 1]=0; // G 

((unsigned char *)(frame->imageData + i*frame->widthStep))[j*frame->nChannels + 2]=0; // R }}

Я хочу объявить ширину и высоту, используя точки, которые также используются в cvRectangle, то есть точке r.

Однаковывод, никогда не бывает такого же размера, как выглядит прямоугольник.Выходные данные, как правило, представляют собой прямоугольник или квадрат, черного цвета, но с разными и меньшими размерами, чем у прямоугольника, которым он и должен быть, и они также меньше и не выровнены.

Я не знаюпочему.

Пожалуйста, помогите.Цель состоит в том, чтобы покрыть лицо черным, скрыть лицо черными пикселями.

Пожалуйста, помогите мне.Спасибо.

1 Ответ

0 голосов
/ 26 октября 2011

Ну, во-первых, вы повторно используете переменную i, что является большой проблемой.Измените этот самый верхний цикл for, это просто сбивает с толку.

Кроме того, ваши самые внутренние два цикла for неправильны.Они должны быть:

for(int i = y; i < y + height; i++){
    for(int j = x; j < x + width; j++){

Имейте в виду, что вы зацикливаетесь на абсолютных координатах, а ширина и высота являются относительными терминами.Также обычно вы хотите, чтобы переменная y была во внешнем цикле, потому что это делает доступ к памяти более быстрым (по крайней мере, с OpenCV).

...