C++-将RGB 1-D阵列转换为OpenCV Mat图像

C++ - Convert RGB 1-D Array to OpenCV Mat Image

本文关键字:OpenCV Mat 图像 转换 阵列 RGB 1-D C++-      更新时间:2023-10-16

我使用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*)数据等)都只返回了一个黑色图像。我做错了什么?

或者,我只使用OpenCV,因为如果不使用for循环,我找不到一种更简单的方法来使用C++从数组中保存图像。我已经成功地通过循环所有像素并单独保存它们来保存PPM图像,但现在我需要更高效的东西。如果有不同的方法来保存数组中的图像,我会很乐意使用它。

如果要获得彩色图像,类型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格式。