使用 openCV 在 C++ 中查看灰度 RAW 图像文件

Posted

技术标签:

【中文标题】使用 openCV 在 C++ 中查看灰度 RAW 图像文件【英文标题】:View greyscale RAW image file in C++ using openCV 【发布时间】:2013-03-10 10:31:16 【问题描述】:

我有一个原始图像文件,其中包含从第 5 个字节开始的图像数据。 文件中的每个字节代表一个 8 位灰度像素强度。 我已经能够将图像的二进制数据存储在二维无符号字符数组中。

谁能告诉我如何使用数组或文件在openCV中显示图像?

现在我正在使用这个代码:

void openRaw() 
    cv::Mat img(numRows,numCols,CV_8U,&(image[0][0]);
    //img.t();
    cv::imshow("img",img);  
    cv::waitKey();

但它显示错误的图像。

我也尝试过使用 IplImage 方法,但我不确定如何将指针传递给那里的源图像。

谁能给我一些代码?

谢谢, 乌代

【问题讨论】:

如果图像数据从第 5 个字节开始,那么我猜它并不是那么原始。前面的字节是否包含分辨率?这有点难猜,除非它是一个完美的正方形...... 【参考方案1】:

“我已经能够将图像的二进制数据存储在二维无符号字符数组中。”

这是你的问题。

opencv 将像素数据存储在连续的 uchar* 中,因此它期望你也一样。

你的二维数组很可能是一个指针数组,它不一样。

so: 代替二维数组,制作一维数组:

uchar *data = new uchar[rows * cols];

你可以像这样访问单个像素:

uchar pixel = data[y*cols+x];    

然后将数据指针传递到您的 cv::Mat :

cv::Mat img( rows, cols, CV_8U, data );

哦,请不要再使用 IplImages(又名 1.0 api),不惜一切代价避免使用!

【讨论】:

谢谢!这就像一个魅力!不过我想问一件事,我们可以像在 unsigned char 上那样对 uchar 执行所有算术运算吗?

以上是关于使用 openCV 在 C++ 中查看灰度 RAW 图像文件的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV C++(四)----对比度增强

opencv 怎么取到灰度图像的像素值,C++接口的

opencv:从RGB到灰度的转换只得到蓝色

将灰度、彩色和精巧的图像(3)全部复制到一个大的 IplImage:Opencv 错误?

图像处理OpenCV(C++版)——4.1 对比度增强之灰度直方图

c++ 与opencv 学习笔记五-图像插值01