C++ 在原始图像中提取RGB通道值的库或方法
我正在寻找一种解决方案,用于不同目的的图像比较。 为了使分析成为可能,我需要访问每个像素通道值。 例如:许多相机支持的原始格式 * 是否有一些开源库可以访问频道, 或者可以直接将其提取为字节值吗?C++ 在原始图像中提取RGB通道值的库或方法,c++,image-processing,decoding,bmp,bitmapimage,C++,Image Processing,Decoding,Bmp,Bitmapimage,我正在寻找一种解决方案,用于不同目的的图像比较。 为了使分析成为可能,我需要访问每个像素通道值。 例如:许多相机支持的原始格式 * 是否有一些开源库可以访问频道, 或者可以直接将其提取为字节值吗? * 目前我正在使用bitmap\u image reader(),但是每次转换原始图像bo-BMP进行分析都不是一个好主意,我已经介绍过,它是一种在C++14上编写的库 请建议访问图像数据的最快方式,谢谢。使用ImageMagick,它安装在大多数Linux发行版上,可用于macOS和Windows
* 目前我正在使用bitmap\u image reader(),但是每次转换原始图像bo-BMP进行分析都不是一个好主意,我已经介绍过,它是一种在C++14上编写的库
请建议访问图像数据的最快方式,谢谢。使用ImageMagick,它安装在大多数Linux发行版上,可用于macOS和Windows 在命令行中:
# Convert NEF raw file to 16-bit RGB data
magick image.nef -depth 16 rgb:image.bin
# Convert CR2 raw file to 8-bit RGB data
magick image.cr2 -depth 8 rgb:image.bin
或者将其与C/C++中的popen()
一起使用,并将其写入stdout
:
magick image.dng -depth 16 rgb:-
然后用C/C++阅读
如果要在读取之前识别图像的尺寸:
magick identify temp.png
temp.png PNG 640x480 640x480+0+0 8-bit Gray 2c 12348B 0.000u 0:00.009
如果使用版本6,将
magick
替换为convert
,并将magick-identify
替换为identify
或者,查看NetPBM
PPM
格式(请参见P6
格式)
然后开发一些代码来读取它,然后使用ImageMagick将任何内容转换为PPM
格式并读取,这将在开始时为您提供尺寸:
magick image.nef -depth 16 ppm:-
magick image.cr2 -depth 8 ppm:-
请注意,这正是。ffmpeg采用的策略?还是opencv?你自己试过什么吗?还有,你指的是什么原始格式,显然有几种可用的格式?[我不是专家]但通常质量的相机的格式,据我所知,几乎是无损的,命名为原始格式。例如,JPEG有大量的压缩来减少文件大小——从质量角度来看,它不是一种好格式。帕姆,你有什么建议吗?谢谢回复这取决于…JPEG可以是无损的,在这种情况下它是完全可逆的,和bmp一样好。但唯一的方法是从相机中获取这两个东西并进行比较,或者查看JPEG比特流。我没有使用ffmpeg进行原始到bmp的转换,但这将是我的第一个调用端口(默认情况下我没有ImageMagick)。我可以逐个访问它们RGB->RGB?你有一些例子的来源链接吗?谢谢。但是看起来我会使用系统调用(运行Toell MaGik/NETPBM)从原始格式转换成其他格式,然后我需要提取字节,它不可能直接用C++中的打开文件提取值,这是可能的,但是接下来你必须学习
Magick++
库,并编译和链接它——这是可能的,但学习曲线要陡峭得多。在StackOverflow搜索框中放入[magick++]
作为示例。我建议您使用popen()
而不是system()
然后您只需从管道中读取,而无需在磁盘上创建临时文件。请注意,如果您想读取NEF/CR2/DNG文件,您需要安装dcraw
或ufraw
库,ImageMagick可以在其中找到它们。