0

以下の長方形配列を使用して、Haar Classifier によって検出された顔をループします。

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」が宣言されていないと言っています。

4

2 に答える 2

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();
于 2013-08-28T07:47:50.123 に答える
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 );

于 2013-08-28T06:58:02.260 に答える