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

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 回答