C ++ - 将RGB 1-D数组转换为OpenCV Mat图像

时间:2016-07-20 19:39:05

标签: c++ arrays image opencv rgb

我使用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图像,但现在我需要更高效的东西。如果有不同的方法来保存数组中的图像,我很乐意使用它。

1 个答案:

答案 0 :(得分:3)

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