如何从YUY2 yuyv422原始视频中逐像素获取值?

时间:2018-10-17 14:08:34

标签: shell imagemagick pixel video-processing

我有一个视频(扩展名为.ravi),它是IR摄像机软件的输出。 我需要计算该视频中每个帧的每个像素的温度。 红外摄像头+软件公司已经告诉我他们不会帮忙,因为此类信息会透露他们的很多专业知识。

当我播放视频时,例如在mplayer中,温度文件似乎正确显示。因此,转换为像素颜色的信息包含有关其温度的信息。

我的想法是将每个帧隔离到一个文件中,找到每个文件中每个像素的像素信息。我能够使用原始的IR摄像头软件逐个像素地检索温度像素(尽管这是通过单击鼠标单击完成的,每个帧都不可行)。然后,在一侧具有像素信息而在另一侧具有温度信息(均为第一帧),我希望通过一个函数将它们关联起来,并希望该函数适用于视频的所有帧。 >

对于该视频,我获得了以下元数据(来自FFMEPG):

Metadata:
META            : (640,480,16,312500),(0,0,0,0),0,1,80
Duration: 00:13:53.06, start: 0.000000, bitrate: 158338 kb/s
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x481, 157619 kb/s, 32 fps, 32 tbr, 32 tbn, 32 tbc

我猜我在播放视频时看到的颜色与像素温度有某种关系,它来自每个像素的YUV值。

我如何访问该信息?

我尝试使用FFMPEG将每个帧转换为图像(例如PNG),然后获取每个像素的值(例如,使用ImageMagick),但得到RGB值。

以下@VC。我可以将每一帧转换为一个文件:

ffmpeg -i original.ravi -c copy -pix_fmt yuyv422 frame%05d.bmp

(如果我使用.yuv而不是.bmp作为扩展名,则会得到一个文件,而不是每个帧都有一个文件。)

现在,每个帧都有一个文件,我可以使用ImageMagick进行查看:

convert -size 640x481 -depth 8 -sampling-factor 4:2:2 YUV:frame00001.bmp -colorspace YUV frame00001.txt

这是输出的样子:

# ImageMagick pixel enumeration: 640,481,65535,yuv
0,0: (12436,26650,58361)  #3068E3  yuv(48,104,227)
1,0: (6314,29662,45762)  #1973B2  yuv(25,115,178)
2,0: (15547,25111,19123)  #3C624A  yuv(60,98,74)

从文档中,我了解以下信息: 第一行,标题,包含有关像素数(640x481)和每个YUV字段的最大值的信息:65535(我想这是来自-depth 8选项) 然后,对于每个像素,画一条线:其位置,将YUV值放在方括号中,然后将RGB值作为注释,然后是我不明白的其他内容。

即使扩展名为.bmp,单个框架是否真的保存为yuv文件? 我可以正确读取ImageMagick的输出吗?

1 个答案:

答案 0 :(得分:0)

(1)

  

“我希望对视频的每一帧都有每个像素的亮度和色度值。”

首先...通过FFmpeg将视频分成单个帧:

ffmpeg -f rawvideo -framerate 32 -s 640x481 -pix_fmt yuyv422 -i input.yuv -c copy frame%d.yuv

这会将每个帧作为单独的YUV输出(例如: frame01.yuv frame02.yuv )。注意:没有图片宽度或高度的标题,因此以后在使用YUV文件时必须指定图片大小。

第二...获取像素值:

我不使用ImageMagick,而是使用手册的quick research

convert -size 1024x768 -colorspace YUV frame01.yuv output01.txt

以上内容未经测试,有可能您还需要-sampling-factor 4:2:2甚至-depth 8作为输入选项。您比我在此计划上拥有更多的经验。甚至可以尝试:

convert -size 1024x768 -depth 8 YUV:frame01.yuv -colorspace YUV output01.txt
  

“ ...如何确定我获得的yuyv422与原始视频中的相同?”

您可以在十六进制编辑器中打开每个YUV文件,以字节形式查看YUV数据(或找到打印二进制数据的命令行工具)。

例如,一个黄色像素看起来像:

RGB(24):[FF] [F2] [00] ...其中红色= FF(255),绿色= F2(246),蓝色= 00(0)。

YUYV422(16):[CB] [13] [CB] [96] ...其中Y0 = CB(203),U0 = 13(19),Y1 = CB(203),V0 = 96(150)。

因此,从第一个像素的索引0开始,lum(Y)为203,ChromaB(U)为19,跳过一个字节( ie:第三字节),得到ChromaR(v) =150。因此第一个像素YUV在帧的YUV数据的字节内为[CB][13][96]

第二个像素从先前跳过的第三个字节[CB]开始。
请参见下图以获取YUV字节结构...