【问题标题】:OpenCV error-cvtColor require 1-channel image and how to fix it?OpenCV error-cvtColor 需要 1 通道图像,如何解决?
【发布时间】:2015-05-15 19:48:58
【问题描述】:

我是 C++ 和 OpenCV 的新手,我目前的项目需要从矩阵转换为灰度图像。 这里我使用了函数 cvtColor,但由于某种原因,它不断崩溃导致错误:“OpenCV 错误:断言失败(scn==3 | scn==4) in 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”是单通道图像,所以我有 2 个主要问题:

  1. 如何修复此断言错误?我需要将 tt 转换为 3 或 4 通道吗?如何?
  2. 还有其他功能可以为 1 通道图像做同样的工作吗?

【问题讨论】:

  • cvtColor(tt, tgray, COLOR_BGR2GRAY);需要一个 3 通道输入,您的 tt 只有一个。为什么要将单通道 Mat 转换为单通道 Mat ?
  • 你可能甚至不需要 cvtColor() 操作
  • 但是为什么在 matlab 中的 Mat tt 和这个: tgray=mat2gray(tt) deosn 没有给出相同的输出?我的意思是,这两个功能都是将矩阵转换为灰度图像,对吗?因此,如果 tt 已经是灰度的,那么 mat2gray(tt) 的函数是什么?
  • opencv != matlab.盲目的 1:1 代码转换在这里并不是一个好主意。
  • 我知道,我只是想知道,谢谢:D

标签: c++ opencv


【解决方案1】:

正如 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] 为unsigned short
  • [0..1] 用于 floatdouble

【讨论】:

    【解决方案2】:

    根据http://de.mathworks.com/help/images/ref/mat2gray.htmlmatlab mat2gray 缩放矩阵中的值以适应范围 [0..1](黑色 = 0,白色 = 1)。

    所以你可以使用

    cv::normalize(tt, tgray, 0, 1, cv::NORM_MINMAX);
    

    或一般来说:

    cv::normalize(sourceMat, destinationMat, 0, 1, cv::NORM_MINMAX);
    

    【讨论】:

      【解决方案3】:

      所有图像都是矩阵。您可以通过imshow("Image", tt) 查看cv::Mat 中的内容。
      并符合:

      cvtColor(tt, tgray, COLOR_BGR2GRAY);
      

      您试图将具有 3 或 4 个平面的矩阵转换为具有 1 个平面的矩阵。转换类型由COLOR_BGR2GRAY 常量控制。关于cvtColor()函数的信息你可以在OpenCV documentation找到

      在这种情况下,您不需要转换 tt 矩阵 - 它已经是灰度图像。

      【讨论】:

      • 谢谢你的帮助,但是你能告诉我matlab中的mat2gray函数和这个函数之间的区别吗?为什么 Mat tt 和这个: tgray=mat2gray(tt) 没有给出相同的输出?
      猜你喜欢
      • 2022-08-09
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 2020-10-27
      • 2018-02-04
      相关资源
      最近更新 更多