具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图和实施例,对本发明进行进一步详细说明,为了便于说明,仅示出了与本发明实施例相关的部分。应当理解,此处所描写的具体实施例,仅仅用于解释本发明,并不用以限制本发明。
本发明实施例提出一种自适应B帧编码方法和系统,所述方法方法通过分析片源帧间信息的冗余度,自适应调整B帧间隔,达到帧间信息冗余度的最大化消除,从而提升编码器的压缩性能。另一方面,设置加速判断变量,使得该算法能适应不同应用环境对计算量控制的需求。
实施例一
图1是本发明优选实施例一种自适应B帧编码方法流程图,所述方法包括以下步骤:
Step1:设置加速判断变量fastn的值;
是否采用加速处理方法由用户确定,各加速处理方法可以独立选择;
如果要使用该加速处理方法,则设置该加速判断变量fastn的值为1;否则,则设置该加速判断变量fastn的值为0;n=1,2,...,4。
Step2:令t=1。
Step3:如果t+bframes+1<numberframe,则计算framet的统计特性(即TI_framet和TISI_framet),进入Step4;否则,采用原始编码器设置帧类别的方法,对所有未编码帧编码,结束。
t表示编码帧图像在片源序列中的时间序号;bframes为编码器默认的B帧间隔常量;framet称为第t帧编码帧;numberframe表示编码片源的帧数。
所述计算framet的统计特性的方法具体包括以下步骤(如附图2所示):
Step31:如果加速判断变量1(记为fast
1)的值为0,则设置当前处理帧
为frame
y,t,即
设置当前后续默认处理帧
为frame
y,t+bframes+1,即
然后进入Step32;否则,进入Step311。
Step311:对第t帧编码帧frame
t的亮度信息帧frame
y,t进行下采样处理,获取
其中,framet称为第t帧编码帧,也称为当前编码帧;framey,t称为framet的亮度信息帧;为framey,t进行下采样处理后的亮度信息帧;下采样方法可采用公知的最邻近法、双线性插值、三次卷积等;t表示编码帧图像在片源序列中的时间序号。
Step312:对第t+bframes+1帧编码帧frame
t+bframes+1的亮度信息帧frame
y,t+bframes+1进行下采样处理,获取
其中,frame
t+bframes+1称为第t+bframes+1帧编码帧,也称为第t帧后续默认编码帧;frame
y,t+bframes+1称为frame
t+bframes+1的亮度信息帧;
为frame
y,t+bframes+1进行下采样处理后的亮度信息帧;bframes为编码器默认的B帧间隔常量;
与
应具有相同的分辨率。
Step313:设置当前处理帧为
即
设置当前后续默认处理帧为
即
Step32:利用当前处理帧和当前后续默认处理帧,计算统计变量1和统计变量2(分别记为TI_framet和TISI_framet),统计变量1和统计变量2统称为当前编码帧的统计变量。具体计算方法如下(如附图3所示):
Step321:计算块统计变量1,块统计变量2或块统计变量3(分别记为ti_blockt,n、tisi_blockt,n、si_blockt,n),具体包括以下步骤;(如附图4所示)
Step3211:将当前处理帧划分成块,将当前处理帧的第n个块记为
再将当前后续默认处理帧划分成块,将当前后续默认处理帧的第n个块记为
块的大小可以根据需要确定,常用的如16x16、8x8等;
与
须大小一致;全文中,当块的大小为16x16,则称为宏块;当宏块进一步划分为的大小为n×m的块(n≤16或者m≤16,但两者不能同时等于16),则这些尺寸小一些的块称为子块。
Step3212:计算每一个块的块统计变量1,即ti_blockt,n,
n=1,2,......,numberblock。
其中,
全文中,
为
第i行第j列的像素值;
为
第i行第j列的像素值;
表示属于
的所有
的集合,
表示属于
的所有
的集合;记number
block为一帧图像包含的块总数;std表示求均方差;
and
表示对
与
进行减法运算,其中要求
属于
并且
属于
,然后对所有求取的
求均方差。
Step3213:如果加速判断变量2(记为fast2)的值为0,则计算每一个块的块统计变量2,即tisi_blockt,n,否则则计算每一个块的块统计变量3,即si_blockt,n,n=1,2,......,numberblock,具体计算公式如下:
全文中,const_div=10
-5,
表示对属于
的所有
求均方差;其余变量含义及表达式同Step3212。
Step322:计算统计变量1和统计变量2,即TI_framet和TISI_framet
全文中,
表示对所有满足条件的变量求均值;TI_frame
t和TISI_frame
t统称为当前编码帧frame
t的统计特性。
Step4:计算修正B帧间隔bframesm,计算公式如下:
其中,ceil为常规C语言中向上取整函数; Iconst为I帧间隔;如果加速判断变量2的值为1,则Thres1=15,Thres2=0.6,否则Thres1=15,Thres2=1.0;Thres1为统计变量1的判定阈值;Thres2为统计变量2的判定阈值;fps为片源帧率。
Step5:由修正B帧间隔bframesm,确定相应帧的类别,然后对所述相应帧编码。具体如下:
如果t+bframesm+1≤numberframe,则,
如果t+bframes
m+1-poc(I
last)≥I
const,则
为I帧,
为B帧,然后对上述帧编码,接着令t=poc(I
last)+I
const,重新进入Step3。
如果t+bframes
m+1-poc(I
last)<I
const,则
为B帧,
为P帧,然后对对上述帧编码。
否则(即为t+bframesm+1≤numberframe条件不满足)则,
如果number
frame-poc(I
last)≥I
const,则
为I帧,
为B帧,然后对上述帧编码,接着令t=poc(I
last)+I
const,重新进入Step3。
如果number
frame-poc(I
last)<I
const,则
为B帧,
为P帧,然后对上述帧编码,结束。
全文中,frame
下标表示第下标帧编码帧(例如:frame
t表示第t帧编码帧,
表示第poc(I
last)+I
const帧编码帧,
表示第number
frame帧编码帧,其他类似字符的含义不再赘述);
表示上一个I帧的播放序号,I
last表示上一个I帧。
Step6:
编码后(Step5中进行),统计
帧中I宏块的数量;
所述“统计
帧中I宏块的数量”具体为:如果宏块为I宏块或者宏块至少包含一个为帧内预测模式的子块,则
其中,
表示
帧中I宏块的数量;同理
表示frame
t帧中I宏块的数量,其统计方法也使用
一样的方法;全文I宏块指采用帧内预测模式且块的大小为16x16的块。
Step7:如果
则t=t+bframes
m+1,重新进入Step3;否则,如果加速判断变量3(记为fast
3)的值为0,则t=t+bframes
m+1,重新进入Step3;否则,如果t+bframes
m+1+bframes+1≥number
frame,则,采用原始编码器设置帧类别的方法,对所有未编码帧
编码,结束;否则进入Step8。
其中,mbwidth,mbheight分别表示一帧图像划分成宏块以后,图像以宏块为单位的列数和行数。
Step8:统计
帧中第一行宏块行、最后一行宏块行、最左端宏块列,最右端宏块列的运动向量的运动方向;
统计方法如下(如附图5所示):
Step81:按如下方法,计算宏块mb的运动方向。
如果mb为P宏块,则,
否则,如果mb为P子块构成(假设宏块mb由成n个P子块pj构成,j=1,2,......,n),则
其中
否则(即上述条件都不满足),directionmb=no
全文中,mb表示宏块;direction
mb表示宏块mb的运动方向;
表示宏块mb的运动向量,
表示宏块mb的运动向量在x轴方向上的分量,
表示宏块mb的运动向量在y轴方向上的分量;P宏块指采用帧间预测模式且块的大小为16x16的块;P子块指采用帧间预测模式且块的大小为nxm(n≤16或者m≤16,但两者不能同时等于16)的块,记为p
j,即p
j表示第j个子块;
表示p
j的运动向量,
表示p
j的运动向量在x轴方向上的分量,
表示p
j的运动向量在y轴方向上的分量;abs表示求绝对值;left,right,up,down,no分别表示向左运动,向右运动,向上运动,向下运动,无一致趋势运动;
表示对满足条件的所有变量求和,举例说明
就表示
Step82:计算宏块mb运动方向在各方向上的取值;
令上式变量direction分别等于left,right,up,down,no,即可获取
分别表示宏块mb运动方向direction
mb为向左运动,向右运动,向上运动,向下运动,无一致趋势运动的取值;
表示宏块mb运动方向direction
mb为direction的取值。
Step83:计算第一行宏块行、最后一行宏块行、最左端宏块列,最右端宏块列的各个方向上的宏块数量;
其中,
line=left_line,right_line,up_line,down_line,
direction=left,right,up,down,no。
令上式变量line分别等于left_line,right_line,up_line,down_line,即可获取
它们分别表示最左端宏块列在direction方向上的宏块数量,最右端宏块列在direction方向上的宏块数量、第一个行宏块行在direction方向上的宏块数量、最后一行宏块行在direction方向上的宏块数量;
令direction分别等于left,right,up,down,no,即可以获取
它们分别表示line宏块行中向左运动,向右运动,向上运动,向下运动,无一致趋势运动的的宏块数量。
全文中,变量line等于left_line,right_line,up_line,down_line,则分别表示最左端宏块列,最右端宏块列、第一行宏块行、最后一行宏块行;
表示对所有属于line的mb的
进行求和运算;
表示line宏块行在direction方向上的宏块数量。
Step84:计算最左端宏块列的方向,最右端宏块列的方向、第一个行宏块行的方向、最后一行宏块行的方向;
计算公式如下:
令该式变量line分别等于left_line,right_line,up_line,down_line,即可获取direction
left_line,direction
right_line,direction
up_line,direction
down_line,分别表示最左端宏块列的方向,最右端宏块列的方向、第一个行宏块行的方向、最后一行宏块行的方向;max表示求最大值,
表示对所有的direction取值对应
求最大值;
Step9:如果
(directionleft_line=directionright_line=directionup_line=directiondown_line≠no)||
(directionleft_line=left&&directionright_line=right&&directionup_line=up&&directiondown_line=down)||
(directionleft_line=right&&directionright_line=left&&directionup_line=down&&directiondown_line=up)
并且 则,
否则,令bframesmm=bframesm,进入步骤Step10。
条件1=(directionleft_line=directionright_line=directionup_line=directiondown_line=left)||
(directionleft_line=directionright_line=directionup_line=directiondown_line=right);
条件2=(directionleft_line=directionright_line=directionup_line=directiondown_line=up)||
(directionleft_line=directionright_line=directionup_line=directiondown_line=down);
条件3=(directionleft_line=left&&directionright_line=right&&directionup_line=up&&directiondown_line=down)||;
(directionleft_line=right&&directionright_line=left&&directionup_line=down&&directiondown_line=up)
else表示条件1、2、3都不满足;
全文中,所述所选取的宏块行指第一行宏块行、最后一行宏块行、最左端宏块列,最右端宏块列;min为求最小值;min(a,b)表示对a,b求最小值;
表示对m所有取值情况对应的g(m)值求取最小值;
表示对m所有取值情况对应的g(m)值求取最大值;&&和||分别表示并且和或者;二次修正B帧间隔,记为bframes
mm。
Step10:判断加速判断变量4(记为fast4)的值为0还是1,
如果加速判断变量4(记为fast4)的值为0且bframesmm≠bframesm,则令bframesm=bframesmm重新进入Step5。
如果加速判断变量4(记为fast4)的值为0且bframesmm=bframesm,则令t=t+bframesm+1,重新进入Step3。
如果加速判断变量4(记为fast4)的值为1,则进入Step11。
Step11:以bframes
mm为B帧间隔,对所有frame
t(t≤t+bframes
mm+1)编码,每完成一帧编码,则统计frame
t帧中I宏块的数量
所述“统计frame
t帧中I宏块的数量”具体为:如果宏块为I宏块或者宏块至少包含一个为帧内预测模式的子块,则
其中,
表示frame
t帧中I宏块的数量(其统计方法也使用
一样的方法);
Step12:如果
则令t=t+bframes
mm+1,重新进入Step3,否则,判断是否t+bframes
mm*2+2≥number
frame,若是则采用原始编码器设置帧类别的方法,对所有未编码帧编码,结束,若否,令t=t+bframes
mm+1,重新进入步骤Step11。
实施例二
图6是本发明优选实施例一种自适应B帧编码系统结构图;所述系统包括:加速判断变量设置模块、初始化模块、第一判断模块、常规编码模块、统计特性计算模块、修正B帧间隔计算模块、修正编码模块、I宏块的数量统计模块、第二判断模块、宏块行列运动方向统计模块、第三判断模块、第四判断模块、编码及I宏块的数量统计模块、第五判断模块、第六判断模块,
加速判断变量设置模块,用于设置加速判断变量fastn的值;
是否采用加速处理方法由用户确定,各加速处理方法可以独立选择;
如果要使用该加速处理方法,则设置该加速判断变量fastn的值为1;否则,则设置该加速判断变量fastn的值为0;n=1,2,...,4。
初始化模块,用于初始化t=1,t表示编码帧图像在片源序列中的时间序号;
第一判断模块,用于判断是否t+bframes+1<numberframe,若是则进入统计特性计算模块,若否则进入常规编码模块;bframes为编码器默认的B帧间隔常量;framet称为第t帧编码帧;numberframe表示编码片源的帧数。
常规编码模块,用于采用原始编码器设置帧类别的方法,对所有未编码帧编码,结束。
统计特性计算模块,用于计算framet的统计特性;
修正B帧间隔计算模块,用于计算修正B帧间隔bframesm;
计算公式如下:
其中,ceil为常规C语言中向上取整函数; Iconst为I帧间隔;如果加速判断变量2的值为1,则Thres1=15,Thres2=0.6,否则Thres1=15,Thres2=1.0;Thres1为统计变量1的判定阈值;Thres2为统计变量2的判定阈值;fps为片源帧率。
修正编码模块,用于由修正B帧间隔bframesm,确定相应帧的类别,然后对所述相应帧编码。
具体如下:
如果t+bframesm+1≤numberframe,则,
如果t+bframes
m+1-poc(I
last)≥I
const,则
为I帧,
为B帧,然后对上述帧编码,接着令t=poc(I
last)+I
const,重新进入第一判断模块。
如果t+bframes
m+1-poc(I
last)<I
const,则
为B帧,
为P帧,然后对上述帧编码。
否则,则,
如果number
frame-poc(I
last)≥I
const,则
为I帧,
为B帧,然后对上述帧编码,接着令t=poc(I
last)+I
const,重新进入第一判断模块。
如果number
frame-poc(I
last)<I
const,则
为B帧,
为P帧,然后对上述帧编码,结束。
全文中,
表示第下标帧编码帧(例如:frame
t表示第t帧编码帧,
表示第poc(I
last)+I
const帧编码帧,
表示第number
frame帧编码帧,其他类似字符的含义不再赘述);poc(I
last)表示上一个I帧的播放序号,I
last表示上一个I帧。
I宏块的数量统计模块,用于
编码后,统计
帧中I宏块的数量;
所述“统计
帧中I宏块的数量”具体为:如果宏块为I宏块或者宏块至少包含一个为帧内预测模式的子块,则
全文I宏块指采用帧内预测模式且块的大小为16x16的块。
第二判断模块,用于判断是否 若是则t=t+bframesm+1,重新进入第一判断模块;否则判断是否加速判断变量3(记为fast3)的值为0,若是则t=t+bframesm+1,进入第一判断模块;否则,判断是否t+bframesm+1+bframes+1≥numberframe,若是则进入常规编码模块;否则进入宏块行列运动方向统计模块。mbwidth,mbheight分别表示一帧图像划分成宏块以后,图像以宏块为单位的列数和行数。
宏块行列运动方向统计模块,用于统计
帧中第一行宏块行、最后一行宏块行、最左端宏块列,最右端宏块列的运动向量的运动方向;
第三判断模块,用于判断是否
(directionleft_line=directionright_line=directionup_line=directiondown_line≠no)||
(directionleft_line=left&&directionright_line=right&&directionup_line=up&&directiondown_line=down)||
(directionleft_line=right&&directionright_line=left&&directionup_line=down&&directiondown_line=up)
并且
若是则,
否则,令bframesmm=bframesm,进入第四判断模块。
条件1=(directionleft_line=directionright_line=directionup_line=directiondown_line=left)||(directionleft_line=directionright_line=directionup_line=directiondown_line=right);
条件2=(directionleft_line=directionright_line=directionup_line=directiondown_line=up)||(directionleft_line=directionright_line=directionup_line=directiondown_line=down);
条件3=(directionleft_line=left&&directionright_line=right&&directionup_line=up&&directiondown_line=down)||;
(directionleft_line=right&&directionright_line=left&&directionup_line=down&&directiondown_line=up)
else表示表示条件1、2、3都不满足;
全文中,所述所选取的宏块行指第一行宏块行、最后一行宏块行、最左端宏块列,最右端宏块列;min为求最小值;min(a,b)表示对a,b求最小值;
表示对m所有取值情况对应的g(m)值求取最小值;
表示对m所有取值情况对应的g(m)值求取最大值;&&和||分别表示并且和或者;二次修正B帧间隔,记为bframes
mm。
第四判断模块,用于判断加速判断变量4(记为fast4)的值为0还是1,如果加速判断变量4(记为fast4)的值为0且bframesmm≠bframesm,则令bframesm=bframesmm重新进入修正编码模块;如果加速判断变量4(记为fast4)的值为0且bframesmm=bframesm,则令t=t+bframesm+1,重新进入第一判断模块;如果加速判断变量4(记为fast4)的值为1,则进入编码及I宏块的数量统计模块。
编码及I宏块的数量统计模块,用于以bframes
mm为B帧间隔,对所有frame
t(t≤t+bframes
mm+1)编码,每完成一帧编码,则统计frame
t帧中I宏块的数量
所述“统计frame
t帧中I宏块的数量”具体为:如果宏块为I宏块或者宏块至少包含一个为帧内预测模式的子块,则
第五判断模块,用于判断是否
若是则令t=t+bframes
mm+1,重新进入第一判断模块,否则,进入第六判断模块。
第六判断模块,用于判断是否t+bframesmm*2+2≥numberframe,若是则进入常规编码模块,若否,令t=t+bframesmm+1,重新进入编码及I宏块的数量统计模块。
进一步地,所述统计特性计算模块还包括:第一加速判断变量判定模块、第一设置模块、第一下采样模块、第二下采样模块、第一设置模块、帧统计变量计算模块,(如图7所示)
第一加速判断变量判定模块,用于判断是否加速判断变量1(记为fast1)的值为0,若是则进入第一设置模块;否则,进入第一下采样模块;
第一设置模块,用于设置当前处理帧
为frame
y,t,即
设置当前后续默认处理帧
为frame
y,t+bframes+1,即
进入帧统计变量计算模块。
第一下采样模块,用于对第t帧编码帧framet的亮度信息帧framey,t进行
其中,frame
t称为第t帧编码帧,也称为当前编码帧;frame
y,t称为frame
t的亮度信息帧;
为frame
y,t进行下采样处理后的亮度信息帧;下采样方法可采用公知的最邻近法、双线性插值、三次卷积等;t表示编码帧图像在片源序列中的时间序号。
第二下采样模块,用于对第t+bframes+1帧编码帧framet+bframes+1的亮度信息帧framey,t+bframes+1进行下采样处理,获取
其中,frame
t+bframes+1称为第t+bframes+1帧编码帧,也称为第t帧后续默认编码帧;frame
y,t+bframes+1称为frame
t+bframes+1的亮度信息帧;
为frame
y,t+bframes+1进行下采样处理后的亮度信息帧;bframes为编码器默认的B帧间隔常量;
与
应具有相同的分辨率。
第二设置模块,用于设置当前处理帧为
即
设置当前后续默认处理帧为
即
然后进入帧统计变量计算模块。
帧统计变量计算模块,用于利用当前处理帧和当前后续默认处理帧,计算统计变量1和统计变量2(分别记为TI_framet和TISI_framet);
进一步地,所述帧统计变量计算模块还包括块统计变量计算子模块、帧统计变量计算子模块(如图8所示),
块统计变量计算子模块,用于计算块统计变量1,块统计变量2或块统计变量3(分别记为ti_blockt,n、tisi_blockt,n、si_blockt,n);
帧统计变量计算子模块,用于根据块统计变量技术统计变量1和统计变量2(分别记为TI_framet和TISI_framet);
全文中,表示对所有满足条件的变量求均值;TI_framet和TISI_framet统称为当前编码帧framet的统计特性。
进一步地,所述块统计变量计算子模块还包括块划分单元、块统计变量1计算单元、块统计变量2或3计算单元(如图9所示),
划分单元,用于将当前处理帧划分成块,将当前处理帧的第n个块记为
再将当前后续默认处理帧划分成块,将当前后续默认处理帧的第n个块记为
块统计变量1计算单元,用于计算每一个块的块统计变量1,即ti_blockt,n,n=1,2,......,numberblock。
全文中,
为
第i行第j列的像素值;
为
第i行第j列的像素值;
表示属于
的所有
的集合,
表示属于
的所有
的集合;记number
block为一帧图像包含的块总数;std表示求均方差;
表示对
与
进行减法运算,其中要求
属于
并且
属于
,然后对所有求取的
求均方差。
块统计变量2或3计算单元,用于判断如果加速判断变量2(记为fast2)的值为0,则计算每一个块的块统计变量2,即tisi_blockt,n,否则则计算每一个块的块统计变量3,即si_blockt,n,n=1,2,......,numberblock,具体计算公式如下:
全文中,const_div=10
-5,
表示对属于
的所有
求均方差;
进一步地,所述宏块行列运动方向统计模块还包括宏块运动方向计算子模块、宏块取值计算子模块、宏块数量计算子模块、宏块行列运动方向计算子模块(如图10所示),
宏块运动方向计算子模块,用于计算宏块mb的运动方向,
如果mb为P宏块,则,
否则,如果mb为P子块构成(假设宏块mb由成n个P子块pj构成,j=1,2,......,n),则
其中
否则(即上述条件都不满足),directionmb=no
全文中,mb表示宏块;direction
mb表示宏块mb的运动方向;
表示宏块mb的运动向量,
表示宏块mb的运动向量在x轴方向上的分量,
表示宏块mb的运动向量在y轴方向上的分量;P宏块指采用帧间预测模式且块的大小为16x16的块;P子块指采用帧间预测模式且块的大小为nxm(n≤16或者m≤16,但两者不能同时等于16)的块,记为p
j,即p
j表示第j个子块;
表示p
j的运动向量,
表示p
j的运动向量在x轴方向上的分量,
表示p
j的运动向量在y轴方向上的分量;abs表示求绝对值;left,right,up,down,no分别表示向左运动,向右运动,向上运动,向下运动,无一致趋势运动;
表示对满足条件的所有变量求和,举例说明
就表示
宏块取值计算子模块,用于计算宏块mb运动方向在各方向上的取值;
令上式变量direction分别等于left,right,up,down,no,即可获取
分别表示宏块mb运动方向direction
mb为向左运动,向右运动,向上运动,向下运动,无一致趋势运动的取值;
表示宏块mb运动方向direction
mb为direction的取值。
宏块数量计算子模块,用于计算第一行宏块行、最后一行宏块行、最左端宏块列,最右端宏块列的各个方向上的宏块数量;
其中,
line=left_line,right_line,up_line,down_line,
direction=left,right,up,down,no。
令上式变量line分别等于left_line,right_line,up_line,down_line,即可获取
它们分别表示最左端宏块列在direction方向上的宏块数量,最右端宏块列在direction方向上的宏块数量、第一个行宏块行在direction方向上的宏块数量、最后一行宏块行在direction方向上的宏块数量;令direction分别等于left,right,up,down,no,即可以获取
它们分别表示line宏块行中向左运动,向右运动,向上运动,向下运动,无一致趋势运动的的宏块数量。
全文中,变量line等于left_line,right_line,up_line,down_line,则分别表示最左端宏块列,最右端宏块列、第一行宏块行、最后一行宏块行;
表示对所有属于line的mb的
进行求和运算;
表示line宏块行在direction方向上的宏块数量。
宏块行列运动方向计算子模块,用于计算最左端宏块列的方向,最右端宏块列的方向、第一个行宏块行的方向、最后一行宏块行的方向;
计算公式如下:
令该式变量line分别等于left_line,right_line,up_line,down_line,即可获取direction
left_line,direction
right_line,direction
up_line,direction
down_line,分别表示最左端宏块列的方向,最右端宏块列的方向、第一个行宏块行的方向、最后一行宏块行的方向;max表示求最大值,
表示对所有的direction取值对应
求最大值;
本领域的普通技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序指令相关硬件来完成的,所述的程序可以存储于一计算机可读取存储介质中,所述的存储介质可以为ROM、RAM、磁盘、光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。