SBS测试文档
杨杭军,2010.9.26
一、SBS概述:
SBS是图像拼接技术的一种,其在立体视频方面应用广泛。SBS在立体视屏编解码方面的大概步骤:
1. 将立体视频左右路序列 对应帧 拼接成一幅图像,保持图像分辨率不变。比如将第100帧的左路图像 与 第100帧的右路图像拼接成 一幅图像(具体拼接方法有多种),并且保证拼接后的图像分辨率与左路(右路)图像保持一致。
2. 将拼接好的视频序列利用现有的H.264编码器进行编码;
3. 在客户端,利用现有的H.264解码器对码流解码,得到左右路拼接序列;
4. 进行拼接的逆运算,将左右路拼接序列分解成左右路两路序列。
5. 图像拼接方法:将左路图像的奇数场与右路图像的偶数场拼接成一幅图像。
二、关键算法
2.1 图像拼接
图像拼接主要目的是把两路图像拼接成一路图像。具体来说,左路右路图像各对应帧各抽取一定的像素值,整合成一帧图像,而在这一过程中要保证图像的分辨率不变。
本测试代码图像拼接采用的方法是:将左路图像的奇数场与右路图像的偶数场拼接成一幅图像。具体可见代码介绍:
将亮度信息拼接成一幅图像: for(i=0;i<height;i=i+2) for(j=0;j<width;j++) { *(Y_out+i*width+j)=*(Y_one+i*width+j); //拼接后的奇数行等于左路图像的该行值 *(Y_out+(i+1)*width+j)=*(Y_two+(i+1)*width+j); //拼接后的偶数行等于右路图像的该行值 }
色度分量拼接:原理与亮度拼接一致! for(i=0;i<UV_height;i=i+2) for(j=0;j<UV_width;j++) { *(UV_out+i*UV_width+j)=*(UV_one+i*UV_width+j); *(UV_out+(i+1)*UV_width+j)=*(UV_two+(i+1)*UV_width+j); } |
2.2 图像分解
拼接后的图像经过编码,传输到客户端,客户端解码,解码之后要观看左右路图像,则必须将解码得到的拼接图像进行分解,恢复左右路图像。
图像分解需要的步骤:将拼接图像分解成左右路YUV,此时左右路高度分辨率均为原来的一半; 对左右路图像进行插值,复原为原始图像的分辨率。
拼接图像分解成两路YUV的代码如下表所示:
for(i=0;i<HEIGHT;i++) for(j=0;j<WIDTH;j++) { if(i%2 == 0) { *(Y_1+i/2*WIDTH+j)=*(Y_in+i*WIDTH+j); //偶数行分解到左路图像 } else *(Y_2+(i-1)/2*WIDTH+j)=*(Y_in+i*WIDTH+j); //奇数行分解到右路图像 } //这里包括亮度与色度的分解。分解后左右路的分辨率变为:WIDTH * HEIGHT/2 |
对亮度分量进行插值,采取双线性插值算法:
for(i=0;i<out_height;i++) //(i,j)为插值后图像的坐标 for(j=0;j<out_width;j++) { m=1.0*i/out_height*in_height; n=1.0*j/out_width*in_width; //当前图像对应到原图像的坐标(m,n)
x=(int)m; y=(int)n;
p=m-1.0*x; //(m,n)距离左上角像素(x,y)的距离 q=n-1.0*y; // 双线性插值,对(i,j)像素赋值 *(Y_out+i*out_width+j)=( (1-p)*(1-q)*( *(Y_in+x*in_width+y) ) + (1-p)*q* ( *(Y_in+x*in_width+y+1) ) + p*(1-q)* ( *( Y_in+(x+1)*in_width+y) ) +p*q*( *(Y_in+(x+1)*in_width+y+1) ) ); }
|
色度分量的插值(由于人眼对色度的分辨率较低,所以,色度的插值就直接复制)
for(i=0;i<out_height;i=i+2) for(j=0;j<out_width;j++) { *(UV_out+i*out_width+j)= *(UV_in+i*out_width+j); //相邻两行采用相同的亮度值 *(UV_out+(i+1)*out_width+j)=*(UV_in+i*out_width+j); } |
三、测试环境:
操作系统:Ubuntu 9.10 |
硬件性能:
CPU | Intel Pentium® Dual CPU |
主频 | 1.80GHz |
内存 | 2.0GB |
测试序列:
序列 | 分辨率 | 帧数 |
tunnel_L_720X576_250frms.yuv | 720X576 | 250 |
tunnel_R_720X576_250frms.yuv | 720X576 | 250 |
trapeze_L_720X480_450frms.yuv | 720X480 | 450 |
trapeze_R_720X480_450frms.yuv | 720X480 | 450 |
BMX_L_1920X1080_240frms.yuv | 1920X1080 | 240 |
BMX_L_1920X1080_240frms.yuv | 1920X1080 | 240 |
四、测试结果:
QP=37
测试序列 | Y(dB) | U(dB) | V(dB) | 码率(kb/s) |
tunnel_L_720X576_250frms.yuv | 25.188 | 33.581 | 32.951 | 435.89 |
tunnel_R_720X576_250frms.yuv | 23.132 | 33.389 | 32.269 | |
trapeze_L_720X480_450frms.yuv | 22.250 | 36.351 | 35.789 | 483.12 |
trapeze_R_720X480_450frms.yuv | 20.057 | 36.274 | 35.388 | |
BMX_L_1920X1080_240frms.yuv | 20.249 | 31.806 | 34.841 | 4316.38 |
BMX_L_1920X1080_240frms.yuv | 18.886 | 30.858 | 33.961 |
QP=32
测试序列 | Y(dB) | U(dB) | V(dB) | 码率(kb/s) |
tunnel_L_720X576_250frms.yuv | 25.882 | 34.067 | 33.382 | 875.20 |
tunnel_R_720X576_250frms.yuv | 23.308 | 33.657 | 32.524 | |
trapeze_L_720X480_450frms.yuv | 22.472 | 36.797 | 36.197 | 1003.45 |
trapeze_R_720X480_450frms.yuv | 20.065 | 36.467 | 35.641 | |
BMX_L_1920X1080_240frms.yuv | 20.287 | 31.953 | 35.078 | 8354.24 |
BMX_L_1920X1080_240frms.yuv | 18.858 | 30.830 | 33.966 |
QP=27
测试序列 | Y(dB) | U(dB) | V(dB) | 码率(kb/s) |
tunnel_L_720X576_250frms.yuv | 26.316 | 34.457 | 33.899 | 1773.06 |
tunnel_R_720X576_250frms.yuv | 23.327 | 33.848 | 32.835 | |
trapeze_L_720X480_450frms.yuv | 22.577 | 37.231 | 36.512 | 2130.96 |
trapeze_R_720X480_450frms.yuv | 20.062 | 36.649 | 35.809 | |
BMX_L_1920X1080_240frms.yuv | 20.300 | 32.043 | 35.312 | 15950.76 |
BMX_L_1920X1080_240frms.yuv | 18.845 | 30.803 | 33.972 |