【问题标题】:In C++ using opencv I have a uint array converting to a a grayscale image, only shows a gray screen no image在使用 opencv 的 C++ 中,我有一个 uint 数组转换为灰度图像,只显示灰屏没有图像
【发布时间】:2019-03-16 13:27:56
【问题描述】:

我想知道是否有人可以帮助我解决这个问题。我有一个数组(单暗淡),它包含足够的 uint 值来填充大小为 120x160 的屏幕。我想将数组加载到垫子中并将其显示为灰度图像。我没看到有人能帮忙吗??提前致谢。

myarray[39360];
//..
//Code populates values between 0 and 255 to the array
// I have printed the array and the values are all 0 to 255
//..
Mat img,img1;

// load the array into a mat
img(120,160,CV_8UC1,myarray);

// convert the mat to a grayscale image, 3 channel instead of the current 1
img.convertTo(img1,CV_8UC3);
namedWindow("test",WINDOW_AUTOSIZE);
imshow("test",img1);
waitKey(0);

// windows pops up but just shows a gray blank page about mid tone :-(

【问题讨论】:

  • intCV_32SC1 所以尝试img(120,160,CV_32SC1,myarray);img.convertTo(img1,CV_8U); 这样之后,img1 将是一个 CV_8UC1 并且可以显示在 0 = 黑色和 255 = 白色的地方

标签: c++ arrays opencv grayscale


【解决方案1】:
  • myarray 是什么类型?我假设unsigned char[]
  • 如果显示 img,它是否显示正确?这样,您就可以在转换之前检查是否有任何问题。
  • 到 BGR 的转换(这就是您正在做的,您将灰度转换为所有颜色相同的颜色)不会那样工作。这里有两个选择:

    cv::cvtColor(img,img1,cv::COLOR_GRAY2BGR);

    它做同样的事情(可能在旧版本中,类似CV_GRAY2BGR),或者创建一个包含三个img 的数组并使用cv::merge

    • 最后,考虑完全不转换为 BGR。如果你想要一个灰度图像,为什么 1 通道图像还不够呢?如果您使用cv::imwrite 保存它,它甚至会使用更少的空间...

【讨论】:

  • 正确的无符号字符,实际上 uint8_t 是一样的。我只是做了那个转换,因为另一个主题的其他人建议 imshow 没有显示,因为它是一个单通道图像,没有意义然后仍然没有。我有来自示例的 lena 单通道图像,我想我会将它读入一个数组并尝试显示它。使用上述方法。我打印了数组,果然它们都是 0 到 255 之间的值。我很困惑下一步该做什么。至于包括我使用的是正常的嫌疑犯和 这可能是一个问题吗?
【解决方案2】:

如果您想要灰度图像,不确定为什么要使用具有 3 个通道的 Mat(CV_8UC3 表示每个像素 8 个字节,无符号,3 个通道),这里是您尝试做什么的完整示例:

#include "opencv2/highgui.hpp"
#include <vector>
#include <iostream>
#include <ctype.h>
#include <cstdlib>

int main()
{
    //  create a uint8_t array, can be unsigned char too
    uint8_t myArray[120*160];

    //  fill values
    srand(time(0));
    for (int i = 0; i < 120*160; ++i)
    {
        myArray[i] = (rand() % 255) + 1;
    }

    //  create grayscale image
    cv::Mat imgGray(120, 160, CV_8UC1, myArray);

    cv::namedWindow("test", cv::WINDOW_AUTOSIZE);
    cv::imshow("test", imgGray);
    cv::waitKey(0);

    return 0;
}

示例输出图像:

【讨论】:

  • 我试过这个例子我得到完全一样的(悲伤的脸)
  • 我试过了,结果一样。我同意这 3 个频道,但我回应了关于类似主题的另一个答案,说 imshow 不适用于当时看起来很奇怪的单频道。
  • 我添加了一个示例图像。
  • 是的,正如我所料,但我的只是一种纯色。 (让我想起了 poltergeist :-)
  • 我做了一个测试,我从 Scalar(x) 创建了一个图像。我改变了 x 的值,图像始终是相同的中间色调灰色。当我改变 x 时,我会期望语气会改变?
猜你喜欢
  • 2017-08-30
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
相关资源
最近更新 更多