【发布时间】: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