OpenCV error-cvtColor需要单通道图像以及如何修复它?

时间:2015-05-15 08:28:43

标签: c++ opencv

我是C ++和OpenCV的新手,我目前的项目需要从Matrix转换为灰度图像。 在这里我使用了函数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);

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

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

3 个答案:

答案 0 :(得分:2)

正如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

答案 1 :(得分:2)

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

所以你可以使用

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

或一般情况下:

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

答案 2 :(得分:1)

所有图像都是矩阵。您可以使用cv::Mat查看imshow("Image", tt)中的内容 在线:

cvtColor(tt, tgray, COLOR_BGR2GRAY);

您尝试将具有3或4个平原的矩阵转换为具有1个平原的矩阵。转换类型由COLOR_BGR2GRAY常量控制。您可以在OpenCV documentation

中找到有关cvtColor()功能的信息

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