RGB到灰度

时间:2013-08-30 08:29:03

标签: opencv

我正在尝试将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);


                }

                }

1 个答案:

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

从您的代码中删除第二行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