2013-08-28 4 views
0

Я использовал массив прямоугольника ниже грани контура, обнаруженный Хаара классификатором:Изменить данные пикселей прямоугольника в OpenCV

for(int i = 0; i < (objects ? objects->total : 0); i++) 
{ 
    CvRect* r = (CvRect*)cvGetSeqElem(objects, i); 
    cvRectangle(frame, cvPoint(r->x, r->y), cvPoint(r->x + r->width, r->y + r->height),colors[i%1]); 

} 

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

CvRect* r; 

Я попытался:

for(int i = 0; i < (objects ? objects->total : 0); i++) 
{ 
r[i]; 
for(int j = r->y; j < r->y + r->height; j++) 
{ 
    for(int k = r->x; k < r->x + r->width; k++) 
    { 
    frame->imageData[k*3] = 0;  
     frame->imageData[k*3+2] = 0; 
    } 
    } 
    } 

т o сохранить только G-канал лица, но он говорит, что переменная 'r' не объявлена.

ответ

0

В этом цикле:

for(int i = 0; i < (objects ? objects->total : 0); i++) 
{ 
    CvRect* r = (CvRect*)cvGetSeqElem(objects, i); 
    cvRectangle(frame, cvPoint(r->x, r->y), ...); 
} 

правильно инициализирован временные локальные переменная r которая используется, в то время как в этом коде:

CvRect* r; 

for(int i = 0; i < (objects ? objects->total : 0); i++) 
{ 
    r[i]; 
    for(int j = r->y; j < r->y + r->height; j++) 
    { 
     for(int k = r->x; k < r->x + r->width; k++) 
     { 
      frame->imageData[k*3] = 0;  
      frame->imageData[k*3+2] = 0; 
     } 
    } 
} 

неинициализированного указатель r рассматривается как массив и даже в пределах нонсенса выражение делает этот код недействительным.

Попробуйте заменить r[i] с r = (CvRect*)cvGetSeqElem(objects, i);

0

Используйте новый экземпляр изображения в качестве указателя Roi. Пример:

Mat myimage(500,500,CV_8U,Scalar(255)); 
imshow("image",myimage); //white image 
cvWaitKey(); 

//Reference matrix 
Mat roi_img(myimage(cvRect(25,25,100,100))); 

roi_img.setTo(Scalar(0)); 
imshow("image",myimage); //image has a black rect area. 
cvWaitKey(); 
Смежные вопросы