我从图像处理的基础开始,我正在尝试使用平均值将RGB图像转换为灰度。
我的代码是
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
int main()
{
Mat image = imread("a.jpg");
namedWindow("Original ");
namedWindow("Grey");
imshow("Original", image);
Mat grey;
std::cout << "hello\n";
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
grey.at<Vec3b>(i, j) = (image.at<Vec3b>(i, j)[0] + image.at<Vec3b>(i, j)[1] + image.at<Vec3b>(i, j)[2]);
}
}
imshow("Grey", grey);
return 0;
}`
我认为Mat Gray在访问for循环中的元素时存在一些问题。
答案 0 :(得分:2)
您需要初始化grey
,
Mat grey(image.rows, image.cols, CV_8UC1);
然后,在处理过程中,
for (int j = 0; j < image.cols; j++)
{
grey.at<Vec3b>(i, j) = ((image.at<Vec3b>(i, j)[0] + image.at<Vec3b>(i, j)[1] + image.at<Vec3b>(i, j)[2]))/3;
}
/3
将为您提供 true 灰度值。
HTH
答案 1 :(得分:1)
当然,你还没有初始化它,所以它是空的,你无法访问元素。
Mat grey = Mat::zeros(image.rows, image.cols, CV_8UC1);
应该修复它。
在访问Mat
:
if (grey.empty())
{
std::cout << "Empty Mat!\n";
return -1;
}
另一件事是添加图像通道不是真正的灰色格式see this。