注意:我必须手动执行此操作,因此不建议我使用库函数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的问题)
我有两个问题
任何答案都将不胜感激。 提前谢谢。
答案 0 :(得分:2)
我可以告诉你:: 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图像的扫描线没有在存储器中分割,一条扫描线的像素在存储器中彼此相邻。