我绝对是c ++和opencv库的新手。我正在浏览stackoverflow并搜索网页,但无法找到我的问题的答案。
如何在c ++中将浮点数组保存到图像中?目前(作为练习)我只是手动将图像转换为灰度(虽然我读到这可以用opencv完成)。
稍后我打算做一些过滤操作和其他像素操作。这就是我想使用浮点数组(大小为512 * 512)的原因。
这是代码。我所知道的是,float数组必须转换为int或char或uint8或cv :: Mat,以便它可以保存为.png,但我不知道如何。
任何提示或链接都受到高度赞赏。
#include <stdio.h>
#include <opencv2/highgui/highgui.hpp>
int main(void)
{
// load in image using opencv and convert to char
cv::Mat myImg = cv::imread("~/Lenna.png", CV_LOAD_IMAGE_COLOR);
unsigned char *img = (unsigned char*)(myImg.data); //somehow only works for unsigned char and not for float (SegFault)
float *r = new float[512*512];
float *g = new float[512*512];
float *b = new float[512*512];
float *gray = new float[512*512];
// 3*iCol, bc every pixel takes 3 bytes (one for R channel/B channel /G channel).
// see http://answers.opencv.org/question/2531/image-data-processing-in-cvmat/
// faster to loop through rows first and then through colums (bc MAT stored in row-major order)
uint iPix = 0;
for(int iRow=0; iRow<512 ;iRow++){
for(int iCol=0; iCol<512 ;iCol++){
b[iPix] = (float) img[myImg.step * iRow + 3*iCol ];
g[iPix] = (float) img[myImg.step * iRow + 3*iCol + 1 ];
r[iPix] = (float) img[myImg.step * iRow + 3*iCol + 2 ];
gray[iPix] = (float) 0.0722*b[iPix] + 0.2126*r[iPix] + 0.7152*g[iPix];
iPix++;
}
}
//write image to file (NOT WORKING!)
cv::imwrite("~/imgOut.png", (cv::Mat) gray);
}
答案 0 :(得分:6)
您可以使用
cv::imwrite("~/imgOut.bmp", cv::Mat(512, 512, CV_32FC1, gray));
PS:我将其保存到BMP而不是让它工作,因为对于imwrite()
,只有8位(或16位无符号(CV_16U
)以防万一PNG,JPEG 2000和TIFF)可以使用此功能保存单通道或3通道(带'BGR'通道顺序)图像。
答案 1 :(得分:4)
将它保存为BMP对我的情况没有帮助。我使用OpenEXR格式。您需要使用 .exr 扩展名保存文件。