手动灰度在openv中太慢
manual grayscale in opencv is too slow
注意:我必须手动执行此操作,所以不要建议我使用库函数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的问题)
我有两个问题
- 我只是想知道是否有任何方法手动灰度图像是一样快的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++ 中将 RGB 更改为灰度
- OpenCV - 如何在灰度图像上应用 Kmeans?
- OpenCV - 如何将灰度转换为彩色(CV_8UC3)?
- C++灰度图像处理
- 如何显示具有 opengl 纹理的灰度图像
- C++ Gdi+将图像转换为灰度
- 将 BMP 图像转换为灰度
- 如何使用Canny到32位灰度
- 颜色到灰度转换
- (C++)(Visual Studio) 将高斯模糊滤镜应用于 RGB 中的灰度图像
- 使用 SSE 以最快的速度缩小 8 位灰度图像
- 使用 OpenCV 和 C++将 16 位灰度图像更改为彩色图像
- 有没有办法使用 glDrawPixel 渲染单通道灰度图像?
- goodFeaturesToTrack() 只适用于灰度?
- 如何在OpenCV中减去两个不同尺寸的图像和灰度图像
- 使用 ImageMagick 从像素强度数组创建灰度图像时遇到问题
- 如何将图像转换为灰度 opengl c++
- 将高斯模糊应用于灰度图像
- C++:灰度位图标题和实时绘画+opencv图像处理
- 手动灰度在openv中太慢