在opencv中更改矩形的像素数据

时间:2013-08-28 06:43:51

标签: c++ visual-c++ 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;
     }
     }
     }

仅保留面部的G通道,但它表示未声明变量“r”。

2 个答案:

答案 0 :(得分: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 );

答案 1 :(得分: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();