C++-将RGB 1-D阵列转换为OpenCV Mat图像
C++ - Convert RGB 1-D Array to OpenCV Mat Image
我使用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格式。
相关文章:
- C++中的openCV Mat访问冲突
- 如何通过引用传递OpenCV MAT
- Read OpenCV Mat 16bit to QImage 8bit Greyscale
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- 将 OpenCv Mat 从 C++ 传递给 Python
- 将帧从 h264 流解码到 OpenCV Mat
- 如果函数使用 OPENCV Mat 作为输入,如何编写头文件?
- 无法从Java读取C++中保存的Opencv Mat映像
- 如何通过套接字发送OpenCV Mat
- 如何有效地在OpenCV Mat和GpuMat上进行元素处理?
- 什么是使用 opencv::Mat 优化 c++ 矩阵计算
- openCV Mat 中的值在自定义类构造函数中设置后不会保留
- OpenCV Mat 的逗号分隔初始值设定项是如何用C++实现的?
- Libav AVFrame to Opencv Mat to AVPacket conversion
- 采用OpenCV Mat<doube>并转换为12位值数组。
- 如何将C++数组转换为opencv Mat
- 通过QT WebSocket将OpenCV Mat Image发送到HTML客户端
- OpenCV Mat::row assignment
- 如何在 OpenCV Mat 中保留固定的缓冲区大小
- OPENCV MAT问题:直方图和此循环之间的差异