一种基于动态图像实现视频编码防抖的方法及编码器的制作方法

文档序号:7629500阅读:124来源:国知局
专利名称:一种基于动态图像实现视频编码防抖的方法及编码器的制作方法
技术领域
本发明属于计算机视频编码技术,涉及对计算机图像的处理,具体涉及一种基于动态图像实现视频编码防抖的方法及编码器,本发明应用于手持摄像设备中的视频编码器。
背景技术
随着数码相机、数码摄像机等设备的日益普及,人们对数码产品的要求也进一步提高。手持摄像设备由于人为的抖动而造成图像的晃动。这种恼人的现象可以通过防抖技术来消除。
现阶段在数码设备中的防抖系统主要分为两大类光学防抖和电子防抖。光学防抖是通过镜头内置的仪器感应相机的抖动,通过调整镜头内透镜的位置而达到防抖效果。电子防抖,是通过电子手段来对图像进行处理,以减轻抖动对成像的影响。
电子防抖方法通常采用数字图像处理的方法,避免防抖硬件的使用。由于造价低廉,通常用于低端的数码相机和数码摄像机中。由此可见,光学防抖和电子防抖两种技术各有优缺点。光学防抖技术的防抖效果好,可以充分利用CCD的采集像素,但是需要透镜运动补偿装置,因此造价相对较高。电子防抖无需透镜运动补偿装置,造价低廉,实现简单,但是降低CCD的利用率。无论是光学防抖还是电子防抖,多数方法都需要一个运动的传感器—抖动补偿陀螺仪来感知运动的方向和强度,从而采用光学方法和电子方法进行补偿。
数字视频信号的数据量非常大,对于一个640×480@30fps的视频序列,如果采用RGB24的数据形式,则数据率26MB/s。随着图像尺寸的增加和帧率的提高,数据率还会更高。高数据率对传输设备和存储设备都提出了更高的要求。为了降低数据率,更为有效的传输和存储视频数据,视频压缩技术就应运而生。通过数据压缩技术,消除图像中的冗余信息,既保证图像质量满足实际的需求,又大大减少数据量,降低传输和存储系统的负担。现阶段常用的视频压缩方法有Mpeg1,Mpeg2,Mpeg4,H.26X和VC-1等。

发明内容
本发明提出了一种基于动态图像实现视频编码防抖的方法及编码器,所述方法无需外加运动传感器,而通过运动估计方法获得全局的运动矢量,用于描述存在的抖动;通过基于宏块与块的运动矢量插值方法,形成用于最终编码的基于宏块与块的运动矢量。这样,具备防抖功能的视频编码器就可以仅通过一次运动估计过程,同时获取用于防抖的全局运动矢量和用于最终编码的基于宏块与块的运动矢量,大大减少了计算的复杂度。
本发明所述方法可应用于数字摄像机中的视频编码器,本发明所述的视频编码器中,整合了视频压缩和电子防抖两大功能,在数据压缩的同时实现防抖功能。该视频编码器的优势在于无需外加的抖动补偿传感器,而是利用了现有的视频编码器中的运动估计模块来分析拍摄景物的运动情况,获取全局运动矢量用于补偿抖动;同时,本发明将视频编码器中运动估计模块和防抖模块紧密耦合,通过二者的结合,实现了对编码图像的防抖功能,通过共用运动矢量,减少了单独进行视频压缩和防抖实现的运算代价。本发明仅通过一次运动估计即可得到用于补偿抖动的全局运动矢量,又通过插值方法获得用于视频编码的块与宏块的运动矢量,大大节省了由于单独运动估计进行补偿运动矢量计算的计算量。
本发明具体是这样实现的一种基于动态图像消除视频编码抖动的实现方法,包括如下处理(一)运动估计对输入的当前帧,进行预裁剪,形成预裁剪后的有效像素区域;对当前帧的预裁剪有效像素区域的每个宏块与块进行运动估计;由视频编码器的运动估计模块输出每个宏块与块相对于参考帧的运动矢量;(二)防抖统计宏块与块的运动矢量的分布频度,以频度最高的运动矢量作为相对全局运动矢量;计算绝对全局运动矢量,用于裁剪有效像素区域;依据绝对全局运动矢量,在总像素区域的图像大小上重新裁剪有效像素区域,补偿由于抖动形成的全局运动矢量;(三)运动矢量插值根据预裁剪后有效像素区域中宏块与块的运动矢量和当前帧用于补偿抖动的全局运动矢量,通过插值获得抖动补偿后重新裁剪有效像素区域宏块与块的运动矢量;(四)视频编码对通过插值获取重新裁剪后有效像素区域的宏块与块的运动矢量,形成基于数据块和基于宏块的运动矢量,将运动矢量输入视频编码器的运动补偿和编码模块,进行后续的视频数据编码。
所述(一)运动估计中,当前帧预裁剪的位置以参考帧的绝对运动矢量为依据;
所述运动矢量的精度可以是整像素,或者半像素、或者1/4像素。
所述(二)防抖中,所述绝对全局运动矢量,在帧号为1时为零;在帧号大于1时为相对全局运动矢量的和。
所述(三)运动矢量插值中,所述插值采用双线性插值方法,或者其它插值方法实现;所述运动矢量的精度依据视频编码器的精度要求进行四舍五入。
所述(四)视频编码中,通过(三)运动矢量插值所得到的数据块运动矢量计算数据块全局运动矢量相对于所述数据块运动矢量的方差;如果所述方差小于给定阀值,则选择1MV方式,否则选择4MV方式;若运动矢量的精度为整像素时,给定阀值为2;若运动矢量的精度为半像素时,给定阀值为1。
所述(四)视频编码中,如果裁剪后有效像素区域的位置为宏块,如果对应预裁剪有效像素区域的几个数据块中有一个为帧内编码方式,则采用帧内编码方式;如果裁剪后有效像素区域的位置包含预裁剪有效像素区域中边界以外的宏块,或者采用相邻的宏块编码方式,或者采用帧内编码方式。
一种基于动态图像实现视频编码防抖的编码器,包括运动估计模块,运动补偿和编码模块,防抖模块和运动矢量插值模块;所述防抖模块和运动矢量插值模块添加于所述运动估计模块与所述运动补偿和编码模块之间;所述运动估计模块,用于对输入的当前帧进行预裁剪,对预裁剪后的有效像素区域的每个宏块进行运动估计,然后输出宏块与块相对于参考帧的运动矢量;所述防抖模块,用于统计宏块与块的运动矢量的分布频度,以频度最高的运动矢量作为相对全局运动矢量;将计算得到的绝对全局运动矢量用于在总像素区域的图像大小上重新裁剪有效像素区域,补偿由于抖动形成的全局运动矢量;所述运动矢量插值模块,用于根据预裁剪后有效像素区域中宏块与块的运动矢量和当前帧用于补偿抖动的全局运动矢量,进行插值获得抖动补偿后重新裁剪有效像素区域宏块与块的运动矢量;所述运动补偿和编码模块,用于对通过插值获取重新裁剪后有效像素区域的宏块与块的运动矢量,形成基于数据块和基于宏块的运动矢量,对输入的运动矢量,进行后续的视频数据编码。
所述运动估计模块中,当前帧预裁剪的位置以参考帧的绝对运动矢量为依据;所述运动矢量的精度可以是整像素,或者半像素、或者1/4像素。
所述防抖模块中,所述绝对全局运动矢量,在帧号为1时为零;在帧号大于1时为相对全局运动矢量的和。
所述运动矢量插值模块中,所述插值采用双线性插值方法,或者其它插值方法实现;所述运动矢量的精度依据视频编码器的精度要求进行四舍五入。
所述运动补偿和编码模块,对通过运动矢量插值所得到的数据块运动矢量计算数据块全局运动矢量相对于所述数据块运动矢量的方差;若运动矢量的精度为整像素时,给定阀值为2;若运动矢量的精度为半像素时,给定阀值为1;如果所述方差小于给定阀值,则选择1MV方式,否则选择4MV方式。
所述运动补偿和编码模块,如果裁剪后有效像素区域的位置为宏块,如果对应预裁剪有效像素区域的几个数据块中有一个为帧内编码方式,则采用帧内编码方式;如果裁剪后有效像素区域的位置包含预裁剪有效像素区域中边界以外的宏块,或者采用相邻的宏块编码方式,或者采用帧内编码方式。
现有的防抖技术多采用了外加的运动传感器,表示外界的全局运动。如果将防抖模块和视频编码模块相互分割,则需要进行两次运动估计,一次用于获取全局运动矢量,进行防抖补偿;一次用于视频编码中的宏块和块的运动矢量,用于视频编码。
本发明较前面介绍的多种光学和电子防抖方法,具有实现简单,无需外接运动传感器,完全通过数字图像处理方法实现运动的估计、抖动图像的补偿。通过与视频压缩的相互结合,仅通过一次运动估计过程完成补偿抖动的全局运动矢量的计算和编码的运动矢量的计算。本发明提供了一种简单、有效而且廉价的数码摄像机具有防抖功能的视频编码器,可以应用于数码摄像机、摄像头等具备视频编码模块的多媒体设备中。


图1是CCD总像素,CCD有效像素以及防抖补偿后有效像素的关系示意图;图2是具备防抖功能的视频编码器结构图;
图3是具备防抖功能的视频编码器处理流程图;图4是运动矢量插值过程示意图。
具体实施例方式
本发明提出的方法,使得视频编码器具备防抖功能,是为了解决由于拍摄过程中,因为手的抖动造成的图像平移抖动,不涉及由于旋转和缩放造成的抖动。
本发明为了实现电子防抖,不能够利用全部CCD的采集像素值,因此有效的像素数小于CCD的总像素数,这是实现电子防抖必然出现的情况。而有效像素数相对总像素数的比例是由防抖所支持的抖动幅度有关系的。假定本发明所支持的最大抖动通过相对移动范围作为指标,给定CCD的有效像素区域为CCD总像素区域的中心,则最大的抖动的补偿范围不能超出CCD总像素的区域,因此在水平方向的最大补偿范围为[-YMAX,YMAX],在垂直方向上的最大补偿范围为[-XMAX,XMAX]。
如果抖动总范围位于这个范围内,则可以进行补偿实现电子防抖;如果超过这个范围,则不进行电子防抖。CCD总像素,CCD有效像素以及防抖补偿后的有效像素的关系如图1所示。假定总像素区域大小为M×N,防抖补偿后的有效像素区域大小为M′×N′,则有M′<M,N′<N。
本发明所述的具备防抖功能的视频编码器的结构如图2所示。
本发明所述的整个防抖处理流程如图3所示,具体描述如下;(一)运动估计运动估计采用图2中所示的视频编码器所具有的运动估计模块进行,输入当前帧后,运动估计模块输出每个宏块与块相对于参考帧的运动矢量。这里运动矢量的精度可以是整像素,半像素或者1/4像素等,这里的精度决定了后面的防抖模块和运动矢量插值模块的运算精度。
图像的运动估计是基于块与宏块进行的。现在的多种视频编码器支持16×8,8×16,8×8,8×4,4×8和4×4等多种类型的分块方式。这里仅以Mpeg4中的运动矢量编码方法为例,Mpeg4中存在16×16的宏块和8×8的块。运动估计是以宏块为单位而进行的。每个块的大小为8×8。这里假定图像可以分为S×T个16×16的宏块,则有2S×2T个8×8的数据块。
在Mpeg4中,宏块的编码方式有三类Intra,1MV和4MV。Intra是帧内编码方式,运动矢量可以是基于宏块的,通常称为1MV方式,即一个宏块只有一个运动矢量,也可以表示为4MV,表示一个宏块有四个数据块表示,每个数据块都有各自的运动矢量。但是本发明并不仅限于这些大小类型的数据块,也适用于上述的多种尺寸的分块方法。
这里需要说明的是,由于本发明采用了防抖功能,对参考帧进行了防抖的运动矢量补偿。因此采用运动估计方法进行运动矢量获取时,当前帧图像需要进行预裁剪,形成预裁剪后的有效像素区域。当前帧预裁剪的位置以参考帧的绝对运动矢量为依据。对预裁剪的当前帧的有效像素区域进行运动估计。预裁剪后的有效像素区域大小为M′×N′,可以分为S×T个宏块。
对上述的每一个宏块进行运动估计。这里用于补偿抖动的第1帧的全局运动矢量为0,则第K帧相对于第K-1帧的补偿抖动的相对全局运动矢量为MVK,则第K帧补偿抖动的绝对全局运动矢量(或者相对于第1帧的相对运动矢量)表示为AMVK。
(二)防抖防抖是采用图2中的防抖模块进行,就是利用当前帧图像中的数据块的运动矢量获取全局运动矢量的过程。
该过程具体可以分为几个步骤通过运动估计模块后,形成了多个宏块与块的相对于参考帧的运动矢量。
为了统一运算过程,这里以每个8×8的数据块为单位描述运动矢量。每个数据块的运动矢量可以用MVK(i,j)表示,这里K表示帧号,从1开始。i,j分别为数据块的位置,图像的左上角为(1,1)数据块,右下角为(2S,2T)。其中对于帧内编码Intra方式的宏块,这里的运动矢量设置为0。
统计数据块的运动矢量的分布频度,以频度最高的运动矢量作为相对全局运动矢量MVK。
计算全局的绝对运动矢量,用于裁剪有效像素区域。
AMVK=0K=1Σi=1KMViK>1]]>依据绝对运动矢量,在原始M×N的总有效像素图像上重新裁剪有效像素区域,得到用于补偿由于抖动形成的全局运动矢量。重新裁剪后,有效像素图像的大小为M′×N′。
(三)运动矢量插值运动矢量插值是在图2中的运动矢量插值模块中进行的,根据预裁剪后有效像素区域中宏块与块的运动矢量和当前帧用于补偿抖动的全局运动矢量,进行插值获得抖动补偿后重新裁剪有效像素区域宏块与块的运动矢量,实现裁剪后图像的运动矢量生成,而无需进行二次运动估计。
图像在进行了防抖模块后形成了裁剪后的有效像素区域,而裁剪后的有效像素区域数据块的运动矢量与预裁剪图像数据块运动矢量的定义通常不一致。整个运动矢量的插值过程可以通过图5表示。
图中阴影部分宏块表示通过抖动补偿裁剪后图像数据块定义的位置,而Block1~Block4表示预裁剪图像的数据块定义的位置,运动矢量插值模块就是通过Block1~Block4的运动矢量通过插值方法获得抖动裁剪后图像中数据块的运动矢量。
假定Block1~Block4的运动矢量分别为MVK(i,j),MVK(i+1,j),MVK(i,j+1),MVK(i+1,j+1);抖动补偿后裁剪后图像中的数据块运动矢量表示为MV′K(i′,j′);当前帧用于补偿抖动的全局运动矢量为MVK。假定这里的全局运动矢量全部为整像素的。
下面用双线性插值方法为例描述MV′K(i′,j′)的获得。这里方法不仅限于双线性插值方法,其它的插值方法同样适用。这里数据块的大小假定为8×8。
对于补偿抖动后的有效像素区域中的(i′,j′)位置的运动矢量可以由预裁剪图像中第(i,j),(i+1,j),(i,j+1),(i+1,j+1)位置的四个数据块的运动矢量通过插值实现。
对于(i,j),(i+1,j),(i,j+1),(i+1,j+1)超越图像边界的位置这里不进行计算,在后面的视频编码模块中会进行处理。(i′,j′)位置和MVK共同决定了(i,j)位置,(i′,j′)和(i,j)二者的关系为i′=MVK.X/8+ij′=MVK.Y/8+j其中,/为整除操作,MVK.X和MVK.Y分别为全局运动矢量在水平方向和垂直方向的分量。这里采用双线性插值方法,得到防抖裁剪后图像第(i′,j′)位置的图像相对于预裁剪图像(i,j)位置的水平和垂直方向的偏差分别为dx=Mod(MVK.X,8)dy=Mod(MVK.Y,8)其中Mod(x,a)函数表示x模a得到的余数。因此有在补偿抖动后的有效像素区域中第(i′,j′)位置的运动矢量可以表示为MV′K(i′,j′).X=((8-dx)(8-dy)MVK(i,j).X+dx(8-dy)MVK(i+1,j).X+(8-dx)dyMVK(i,j+1).X+dxdyMVK(i+1,j+1).X)/64MV′(i′,j′)K.Y=((8-dx)(8-dy)MVK(i,j).Y+dx(8-dy)MVK(i+1,j).Y+(8-dx)dyMVK(i,j+1).Y+dxdyMVK(i+1,j+1).Y)/64
对于抖动补偿裁剪后图像中有效像素区域内的任意一个数据块,只要(i,j),(i+1,j),(i,j+1),(i+1,j+1)不超越预裁剪图像边界的位置,就能够得到对应的插值后数据块的运动矢量。
这里运动矢量的精度依据视频编码器的精度要求进行四舍五入。
同时可以看出,当采用半像素精度时,dx和dy求解中的模数8应该为16;插值公式中的系数也应该把8改为16,同时除数为256。其它精度以此类推。
(四)视频编码通过运动矢量插值后获取了裁剪后有效像素区域中每个数据块的相对于参考帧的运动矢量后,就可以进行视频编码。所述视频编码是在图2所示的运动补偿和编码模块中实现。
编码过程包括以下过程将基于数据块的运动矢量进行编码方式分析,形成基于数据块和基于宏块的运动矢量。对应裁剪后图像的每个数据块依据下列原则处理如果第(i,j)位置的数据块为宏块,如果对应预裁剪有效像素区域的几个数据块中有一个为帧内编码方式,则该(i,j)位置的数据块为帧内编码方式。
通过(三)运动矢量插值所得到的数据块运动矢量MV′K(i′,j′),计算四个数据块的全局运动矢量MVK相对于该值的方差,即D′K(i′,j′)=Σp,q=01(MVK(i+p,j+q)-MV′K(i′,j′))2]]>如果给定阀值T,有DK′(i′,j′)<T,则选择1MV方式,否则选择4MV方式。这里T的典型值可以选择。
当为整像素时为T=2,当为半像素时为T=1。T可以根据用户的设计要求自行选择。
如果第(i,j)位置的宏块包含预裁剪有效像素区域边界以外的宏块,因为不存在该宏块的运动矢量,可以采用两种方法进行处理一个是直接采用相邻的宏块编码方式;另一个是采用帧内编码方式。
将运动矢量输入视频编码器的运动补偿和编码模块,进行后续的视频数据编码。
权利要求
1.一种基于动态图像消除视频编码抖动的实现方法,其特征在于,包括如下处理(一)运动估计对输入的当前帧,进行预裁剪,形成预裁剪后的有效像素区域;对当前帧的预裁剪有效像素区域的每个宏块与块进行运动估计;由视频编码器的运动估计模块输出每个宏块与块相对于参考帧的运动矢量;(二)防抖统计宏块与块的运动矢量的分布频度,以频度最高的运动矢量作为相对全局运动矢量;计算绝对全局运动矢量,用于裁剪有效像素区域;依据绝对全局运动矢量,在总像素区域的图像大小上重新裁剪有效像素区域,补偿由于抖动形成的全局运动矢量;(三)运动矢量插值根据预裁剪后有效像素区域中宏块与块的运动矢量和当前帧用于补偿抖动的全局运动矢量,通过插值获得抖动补偿后重新裁剪有效像素区域宏块与块的运动矢量;(四)视频编码对通过插值获取重新裁剪后有效像素区域的宏块与块的运动矢量,形成基于数据块和基于宏块的运动矢量,将运动矢量输入视频编码器的运动补偿和编码模块,进行后续的视频数据编码。
2.如权利要求1所述的基于动态图像消除视频编码抖动的实现方法,其特征在于所述(一)运动估计中,当前帧预裁剪的位置以参考帧的绝对运动矢量为依据;所述运动矢量的精度可以是整像素,或者半像素、或者1/4像素。
3.如权利要求1所述的基于动态图像消除视频编码抖动的实现方法,其特征在于所述(二)防抖中,所述绝对全局运动矢量,在帧号为1时为零;在帧号大于1时为相对全局运动矢量的和。
4.如权利要求1所述的基于动态图像消除视频编码抖动的实现方法,其特征在于所述(三)运动矢量插值中,所述插值采用双线性插值方法,或者其它插值方法实现;所述运动矢量的精度依据视频编码器的精度要求进行四舍五入。
5.如权利要求1所述的基于动态图像消除视频编码抖动的实现方法,其特征在于所述(四)视频编码中,通过(三)运动矢量插值所得到的数据块运动矢量计算数据块全局运动矢量相对于所述数据块运动矢量的方差;如果所述方差小于给定阀值,则选择1MV方式,否则选择4MV方式;若运动矢量的精度为整像素时,给定阀值为2;若运动矢量的精度为半像素时,给定阀值为1。
6.如权利要求1所述的基于动态图像消除视频编码抖动的实现方法,其特征在于所述(四)视频编码中,如果裁剪后有效像素区域的位置为宏块,如果对应预裁剪有效像素区域的几个数据块中有一个为帧内编码方式,则采用帧内编码方式;如果裁剪后有效像素区域的位置包含预裁剪有效像素区域中边界以外的宏块,或者采用相邻的宏块编码方式,或者采用帧内编码方式。
7.一种基于动态图像实现视频编码防抖的编码器,其特征在于,包括运动估计模块,运动补偿和编码模块,防抖模块和运动矢量插值模块;所述防抖模块和运动矢量插值模块添加于所述运动估计模块与所述运动补偿和编码模块之间;所述运动估计模块,用于对输入的当前帧进行预裁剪,对预裁剪后的有效像素区域的每个宏块进行运动估计,然后输出宏块与块相对于参考帧的运动矢量;所述防抖模块,用于统计宏块与块的运动矢量的分布频度,以频度最高的运动矢量作为相对全局运动矢量;将计算得到的绝对全局运动矢量用于在总像素区域的图像大小上重新裁剪有效像素区域,补偿由于抖动形成的全局运动矢量;所述运动矢量插值模块,用于根据预裁剪后有效像素区域中宏块与块的运动矢量和当前帧用于补偿抖动的全局运动矢量,进行插值获得抖动补偿后重新裁剪有效像素区域宏块与块的运动矢量;所述运动补偿和编码模块,用于对通过插值获取重新裁剪后有效像素区域的宏块与块的运动矢量,形成基于数据块和基于宏块的运动矢量,对输入的运动矢量,进行后续的视频数据编码。
8.如权利要求7所述的基于动态图像实现视频编码防抖的编码器,其特征在于所述运动估计模块中,当前帧预裁剪的位置以参考帧的绝对运动矢量为依据;所述运动矢量的精度可以是整像素,或者半像素、或者1/4像素。
9.如权利要求7所述的基于动态图像实现视频编码防抖的编码器,其特征在于所述防抖模块中,所述绝对全局运动矢量,在帧号为1时为零;在帧号大于1时为相对全局运动矢量的和。
10.如权利要求7所述的基于动态图像实现视频编码防抖的编码器,其特征在于所述运动矢量插值模块中,所述插值采用双线性插值方法,或者其它插值方法实现;所述运动矢量的精度依据视频编码器的精度要求进行四舍五入。
11.如权利要求7所述的基于动态图像实现视频编码防抖的编码器,其特征在于所述运动补偿和编码模块,对通过运动矢量插值所得到的数据块运动矢量计算数据块全局运动矢量相对于所述数据块运动矢量的方差;若运动矢量的精度为整像素时,给定阀值为2;若运动矢量的精度为半像素时,给定阀值为1;如果所述方差小于给定阀值,则选择1MV方式,否则选择4MV方式。
12.如权利要求7所述的基于动态图像实现视频编码防抖的编码器,其特征在于所述运动补偿和编码模块,如果裁剪后有效像素区域的位置为宏块,如果对应预裁剪有效像素区域的几个数据块中有一个为帧内编码方式,则采用帧内编码方式;如果裁剪后有效像素区域的位置包含预裁剪有效像素区域中边界以外的宏块,或者采用相邻的宏块编码方式,或者采用帧内编码方式。
全文摘要
本发明属于计算机视频编码技术,涉及对计算机图像的处理,本发明提出了一种基于动态图像实现视频编码防抖的方法及编码器,本发明无需外加运动传感器,而通过运动估计方法获得全局的运动矢量,用于描述存在的抖动;通过基于宏块与块的运动矢量插值方法,形成用于最终编码的基于宏块与块的运动矢量。这样,具备防抖功能的视频编码器就可以仅通过一次运动估计过程,同时获取用于防抖的全局运动矢量和用于最终编码的基于宏块与块的运动矢量,大大减少了计算的复杂度。本发明所述方法可应用于数字摄像机中的视频编码器,所述的视频编码器,整合了视频压缩和电子防抖两大功能。
文档编号H04N7/26GK1791221SQ200510132890
公开日2006年6月21日 申请日期2005年12月29日 优先权日2005年12月29日
发明者夏煜, 王浩, 白锋 申请人:北京中星微电子有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1