c++ - OpenCV error-cvtColor require 1-channel image 以及如何修复它?

标签 c++ opencv

我是 C++ 和 OpenCV 的新手,我当前的项目需要将矩阵图像转换为灰度图像。 在这里我使用了函数 cvtColor,但由于某种原因它不断崩溃导致错误:“OpenCV 错误:断言失败(scn==3 | scn==4)在 cv::cvtColor”。
这是我的源代码:

for (int i = 0; i < 2048; i++)
{
    for (int j = 0; j < 2048; j++)
    {
        t[i][j] = abs((L3[i][j] - L_blurred_3[i][j]) / (sqrt(L2_blurred[i][j] - L_blurred_4[i][j])));
    }
}
Mat tt(2048, 2048, CV_64F, Scalar(0));

for (int i = 0; i < 2048; i++)
{
    for (int j = 0; j < 2048; j++)
    {
        tt.at<double>(i, j) = t[i][j];
    }
}
tt.convertTo(tt, CV_32F);
Mat tgray(2048, 2048, CV_32F, Scalar(0));
cvtColor(tt, tgray, COLOR_BGR2GRAY);

我确实在网站和谷歌上做了一些搜索,我尝试了很多不同的方法,但结果仍然一样,我知道问题是我的矩阵“tt”是一个单 channel 图像,所以我有两个主要问题:

  1. 如何修复这个断言错误?我需要将 tt 转换为 3 或 4 channel 吗?如何?
  2. 是否有任何其他函数可以对 1 channel 图像执行相同的工作?

最佳答案

正如 dFionov 所写,所有图像都是矩阵。如果您想将一些浮点值可视化为灰度图像,您需要将所有值重新缩放到 [0..1] 范围。例如,您可以使用 minMaxLocconvertTo 函数,如下所示:

double minV, maxV;
minMaxLoc(tt, &minV, &maxV);
double alpha = 1. / (maxV - minV);
double beta = -minV * alpha;

Mat gray;
tt.convertTo(gray, CV_32FC1, alpha, beta);
imshow("data", gray);
waitKey();

其他类型的范围是:

  • [0..255] 用于 unsigned char
  • [0..65535] for unsigned short
  • [0..1] 用于 floatdouble

关于c++ - OpenCV error-cvtColor require 1-channel image 以及如何修复它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30254907/

相关文章:

c++ - 我应该重载赋值运算符 C++ 吗?

c++ - 将多维数组偶数元素转移到一维数组

C++ 静态变量给出错误

python - Py_Finalize() 导致 Python 3.9 的段错误但不是 Python 2.7

python - 使用python opencv清除ocr图像

c++ - 二维阵列中的沟槽

c++ - OpenCV 无法使用 imwrite 写入图像

python - 如何在 OpenCV 中实现二值化

c++ - 如何在 C++ 中使用 OpenCV 在相机视觉上检测雨水

opencv - Tesseract对带有粗体文本的图像进行OCR