注意:我必须手动执行此操作,因此不要建议我使用库函数 cvtColor()。

我是 opencv 的新手,我正在尝试使用公式对彩色图像进行灰度处理

(r,g,b) = (r,g,b)/((r+g+b)/3)

这是我转换为灰度的方法(C++):

    Mat dst = src.clone();
for (int i= 0; i<src.rows; ++i)
{
    for (int j = 0 ; j < src.cols; ++j)
    {
        Vec3b myVec = dst.at<Vec3b>(i,j);

        uchar temp = (myVec[0]+myVec[1]+myVec[2])/3;
        Vec3b newPoint(temp,temp,temp);
        dst.at<Vec3b>(i,j) = newPoint ;
    }
}

因为我想对视频进行灰度处理,所以我使用这种方法对其每一帧进行灰度处理。
与使用 cvtColor(src,dst,CV_RGB2GRAY) 相比,它真的很慢。 (我只有waitkey(1)所以不是waitkey的问题)

我有2个问题
  • 我只是想知道是否有任何方法可以手动灰度与 cvtColor 一样快的图像。如果没有,你知道如何优化上面的代码,使灰度视频看起来更流畅。
  • 以上只是灰度的一种方法。
    (r,g,b) = (r,g,b)/((r+g+b)/3)
    你能告诉我有关灰度彩色图像的所有其他方法吗?

  • 任何答案将不胜感激。
    提前致谢。

    最佳答案

    我可以告诉你::at 函数很慢。

    我总是使用结构体,这里的指针是一个 rgb 示例:

    #pragma pack(push, 2)
     struct RGB {        //members are in "bgr" order!
       uchar blue;
       uchar green;
       uchar red;
     };
    

    然后像这样访问图像的像素:
    RGB& rgb = image.ptr<RGB>(y)[x]; //y = row, x = col
    

    像这样更改像素值(对于 RGB 图像):
    image.ptr<RGB>(y)[x].value[0] = 142;
    image.ptr<RGB>(y)[x].value[1] = 255;
    image.ptr<RGB>(y)[x].value[2] = 90;
    

    你可以很容易地将它转化为你的灰度问题。这样做的好处是,它真的很快,因为 cv::Mat 图像的扫描线不会在内存中拆分,一条扫描线的像素在内存中彼此相邻。

    关于c++ - opencv中的手动灰度太慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24319406/

    10-13 06:55