在c++中读取RAW图像或Do RAW图像具有标题
Reading RAW images in c++ or Do RAW images have headers?
我从工作中的一些硬件上得到了一些奇怪的图像。它们来自一个奇怪的硬件,它将多个图像拼接在一起并存储为原始图像。想象一下其中一个同时显示四个图像的计算机安全显示器。基本上就是这样。然后它们被存储为原始图像。Annnnd,这个旧垃圾根本没有任何文档。
我试图编写一个提取器,将图像分割成单独的原始文件。但我用来尝试读取我作为测试提取的图像的原始图像软件表明它已经损坏。我目前认为,即使只是原始数据,也应该有一个文件头。但无论我怎么努力,我似乎都无法在网上找到原始图像文件的定义。我看到有很多不同的原始图像文件类型,但我甚至找不到它们的定义。
有什么建议吗?
编辑:重读这篇文章后,我觉得我不是很清楚。我在读取我想要分割的原始文件时做了一个假设,假设我认为文件中没有标头,并开始用第一个字节的数据复制我提取的第一个图像的数据。我在我写的图像文件中也做了同样的假设,在复制图像时我没有写标题。我相信我关于没有头球的假设是不正确的,我要求澄清这一点。为了帮助阐明这一点,我将包含我编写的测试代码:
#include <stdio.h>
#include <string.h>
using namespace std;
//size of individual image
int width = 400;
int height = 400;
//size of input image
int inputWidth = 1600;
int inputHeight = 8000;
int offset = 16;
char strInputFile[] = "captured.raw";
char strOutputFile[] = "extracted.raw";
int main()
{
printf( "Hin" );
FILE* pInput = NULL;
FILE* pOutput = NULL;
char* buf = new char[width];
memset( buf, 0, width );
pInput = fopen( strInputFile,"rb" );
pOutput = fopen( strOutputFile,"wb" );
if( pInput && pOutput )
{
for( int i = 0; i < height; i++ )
{
//read in a row of pixels
fread( buf, 1, width, pInput );
//write out the row of pixels
fwrite( buf, 1, width, pOutput );
//move the file pointer forward to the next row of pixels
fseek( pInput, inputWidth - width, SEEK_CUR );
}
}
fclose( pInput );
fclose( pOutput );
return 0;
}
考虑到原始图像格式的异构性,我建议采用以下方法:
- 试着将你的原始图像与你能找到的任何原始图像格式规范相匹配(参考维基百科的指南)。正如xpda所指出的,请尝试FreeImage
- 在图像中的任何位置搜索JPEG或TIFF标头,如果找到它,请尝试对其进行解释
- 如果所有其他方法都失败了,那么编写一些代码来逐字节比较各个图像,以确定相似性。对于连续拍摄的图像,如果它们有元数据,则元数据应该非常相似。你可以对图像的内容有一些感觉,比如"所有图像的前120个字节中都有20个公共字节",这意味着可能有标题等等。或者你可能会得出图像没有任何标题的结论,这也是你的一些重要知识(告诉你停止尝试)
你读过关于原始图像格式的文章吗?
这个线程是必读的:RAW图像文件-我的数据是什么格式的?
现代原始图像有各种格式,带有标头和元数据,通常经过压缩,有时还会使用有损压缩进行压缩。许多原始格式没有公开文档。FreeImage可用于读取许多数码相机的原始图像。
旧的安全系统和其他摄像头可能只存储原始数据——一组组成图像的数字,而不存储其他数据。这可能是压缩的,也可能不是压缩的,它可能是RGB值,也可能是非RGB值。
如果没有文档,您可能不得不检查文件的数据,并使用历史悠久的试错编程技术。或者买新相机。:-)
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- 将图像添加到资源文件夹UWP C++
- 彩色图像的卤化物处理平均值
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 重新定位图像时如何前进到下一个内存块
- 在RAW图像中提取RGB通道值的库或方法
- 使用 FreeImage 加载 RAW 灰度图像
- 读取 *.mhd/*.raw 在 ITK 中格式化 3D 图像
- 如何将RAW文件(3D图像)转换为STL格式
- 在c++中读取RAW图像或Do RAW图像具有标题
- 在openCV中查看8位RAW图像文件