0

RGBをグレースケールに変換しようとしています。ただし、出力は元のビデオと同じです。このコードのエラーを教えてください。とても役に立ちます。

IplImage *myimage = cvCreateImage(cvGetSize(videoFrame),IPL_DEPTH_8U, 3);
cvZero(myimage);
CvScalar pixelvalue, setpixelvalue; 
        for (int i=0;i<videoFrame->height;i++)
        {
            for (int j=0;j<videoFrame->width;j++)
            {
                pixelvalue = cvGet2D(videoFrame, i, j); 

                 int b= pixelvalue.val[0];
                 int g= pixelvalue.val[1];
                 int r= pixelvalue.val[2];


                     int gc= r*0.299+g*0.587+b*0.114;
                 setpixelvalue.val[0]=gc; 

                cvSet2D(myimage, i, j, setpixelvalue);
                        cvSet2D(myimage, i, j, pixelvalue);


                }

                }
4

1 に答える 1

1

計算値を上書きしています:

cvSet2D(myimage, i, j, setpixelvalue); //here you are setting pixel value at setpixelvalue
cvSet2D(myimage, i, j, pixelvalue); //and here you overwrite it - change to pixelvalue

コードからこの行の 2 番目を削除cvSet2D(myimage, i, j, pixelvalue);します。また、3 つのチャネルは必要ないと思います。1 つで十分です。コードの最初の行を に変更しますIplImage *myimage = cvCreateImage(cvGetSize(videoFrame),IPL_DEPTH_8U, 1);。何らかの理由で、3 つのチャネルすべてを計算値に設定するよりも、画像に 3 つのチャネルを持たせたい場合は、コードの最初の行を変更せずにこの部分を変更します。

int gc= r*0.299+g*0.587+b*0.114;
setpixelvalue.val[0]=gc; 

これに:

int gc= r*0.299+g*0.587+b*0.114;
setpixelvalue.val[0]=gc; 
setpixelvalue.val[1]=gc; 
setpixelvalue.val[2]=gc; 

もちろんOpenCVには、画像をある色空間から別の色空間に変換する機能があります - http://opencv.willowgarage.com/documentation/cpp/miscellaneous_image_transformations.html#cv-cvtcolor

于 2013-08-30T08:54:38.513 に答える