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