【问题标题】:C++ - Convert RGB 1-D Array to OpenCV Mat ImageC++ - 将 RGB 1-D 数组转换为 OpenCV Mat 图像
【发布时间】:2016-11-24 04:07:45
【问题描述】:

我正在使用 C++,并且我有一个 void* 图像数据数组。我已经确定它是一个 RGB 像素值数组,并且我有关于生成图像的宽度和高度的信息。每个像素值是交错的 R、G 和 B 整数的整数(即 123456 = R:12、G:34、B:56)。我需要将此数组转换为 OpenCV Mat 图像。我在网上找到了很多这样的例子,但没有一个对我来说是成功的。这是最适合我的代码的缩写版本:

cv::Mat image = cv::Mat(width*height*4, 1, CV_8U, (unsigned*)data);
cv::Mat reshaped = image.reshape(0, height);
cv::imwrite("Test.jpg", reshaped);

上面的代码保存了我的彩色图像的灰度拉长版本。我也试过:

cv::Mat image = cv::Mat(width, height, CV_8U, (unsigned*)data);
cv::imwrite("Test.jpg", image);

上面的代码保存了我的彩色图像的一个切碎的灰度版本。我尝试过的其他任何东西(CV_16U、CV_32F、(byte*)data 等)都刚刚返回了黑色图像。我做错了什么?

另外,我只使用 OpenCV,因为我找不到更简单的方法来使用 C++ 从数组中保存图像而不使用 for 循环。通过循环遍历所有像素并单独保存它们,我成功地保存了 PPM 图像,但现在我需要更高效的东西。如果有其他方法可以从数组中保存图像,我很乐意改用它。

【问题讨论】:

  • 您对data 的描述有点混乱,您能说得清楚一点吗?每个通道(单个 R)是整数(int)吗?或者它们每个都是一个无符号字符,它们一起构成一个 int(还有一个用于填充的无符号字符)?

标签: c++ arrays image opencv rgb


【解决方案1】:

如果要获取彩色图像,CV_8U 类型是不够的。此类型表示单通道 8 位图像。如果您的数据确实是一个 32 位整数数组,那么您想要的是 CV_8UC4

cv::Mat image = cv::Mat(width, height, CV_8UC4, (unsigned*)data);

第 4 个通道代表 alpha 值(透明度)。如果你想放弃它,你可以要求 OpenCV 将你的图像转换为CV_8UC3

image = cv2.cvtColor(image, cv2.CV_BGRA2BGR)

另外,请记住 OpenCV 以 BGR 顺序表示颜色值。创建图像时,请确保您的数据采用 BGR 格式。

【讨论】:

  • 非常感谢 - 这很有效!我认为这与类型有关,但我对 C++/OpenCV 不够熟练,无法弄清楚。
  • width, height 是错误的方式:参数是rows, columns
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 2018-09-28
  • 2019-12-18
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多