小波變換在圖像音視頻水印中的應(yīng)用_第1頁(yè)
小波變換在圖像音視頻水印中的應(yīng)用_第2頁(yè)
小波變換在圖像音視頻水印中的應(yīng)用_第3頁(yè)
小波變換在圖像音視頻水印中的應(yīng)用_第4頁(yè)
小波變換在圖像音視頻水印中的應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1引言2數(shù)字水印的一般原理3數(shù)字圖像水印本章提出一種以圖案作水印、且提取時(shí)不需原圖的盲數(shù)字水印嵌入算法。這個(gè)算法是基于變換的一種算法,經(jīng)過(guò)研究知道:在小波變換后,紋理和邊緣特征一般集中在高頻子帶LH1、HL1和HH1中,如把水印信息加在低頻系數(shù)LL上,則人眼不易察覺(jué),可以加大水印的嵌入量。由于經(jīng)過(guò)一般的圖像處理以后,高頻上的信息容易丟失,其魯棒性不夠強(qiáng)。但是,一般情況下在嵌入的水印信息的量是較少的,本文為了增強(qiáng)水印的魯棒性,在嵌入的水印信息量較少的情況下,就把水印信息嵌入到低頻系數(shù)上,這樣水印的魯棒性將會(huì)大大增強(qiáng)。所謂水印攻擊分析,就是對(duì)現(xiàn)有的數(shù)字水印系統(tǒng)進(jìn)行攻擊,以檢驗(yàn)其魯棒性,通過(guò)分析其弱點(diǎn)所在及其易受攻擊的原因,以便在以后數(shù)字水印系統(tǒng)的設(shè)計(jì)中加以改進(jìn)。攻擊的目的在于使相應(yīng)的數(shù)字水印系統(tǒng)的檢測(cè)工具無(wú)法正確地恢復(fù)水印信號(hào),或不能檢測(cè)到水印信號(hào)的存在。這和傳統(tǒng)密碼學(xué)中的加密算法設(shè)計(jì)和密碼分析是相對(duì)應(yīng)的。下面我們對(duì)一些典型的攻擊方法進(jìn)行分析[1-9,26-27]。所謂串謀攻擊就是利用同一原始多媒體數(shù)據(jù)集合的不同水印信號(hào)版本,來(lái)生成一個(gè)近似的多媒體數(shù)據(jù)集合,以此來(lái)逼近恢和復(fù)原始數(shù)據(jù),其目的是使檢測(cè)系統(tǒng)無(wú)法在這一近似的數(shù)據(jù)集合中檢測(cè)出水印信號(hào)的存在,其最簡(jiǎn)單的一種實(shí)現(xiàn)就是平均法。3.3.1小波變換的數(shù)字水印算法3.3.2實(shí)驗(yàn)結(jié)果及分析DCT域圖像水印本章算法及實(shí)驗(yàn)結(jié)果分析 4小波變換在數(shù)字音頻水印中的應(yīng)用5視頻水印概述及算法分析6程序附錄clearall;closeall;clc;[filename1,pathname]=uigetfile('*.*','selecttheimage');image1=imread(num2str(filename1));subplot(2,2,1);imshow(image1);title('originalimage');%orginalimageforwatermarkingimage1=double(image1);[row,col]=size(image1);imagew=imread('dmg2.tif');subplot(2,2,2);imshow(imagew);title('watermark');%??ó???è?oˉêyμ÷ó?[marked]=blockdwt2(image1,imagew);%generatesthewatermarkedimage%markedmax=max(marked(:));%markscale=marked/markedmax*255;subplot(2,2,3);colormap(gray(256));image(marked);title('Watermarkedimage');%showsthewatermarkedimageimwrite(marked,gray(256),'marked_image.bmp');%savesthewatermarkedimageasabmpfile%*******??ó?ìáè?1y3ì********watermark=marked-image1;%imageadaptivewatermark%watermark=watermark*255/max(watermark(:))fori=1:row%thresholdingforj=1:colifwatermark(i,j)>0watermark(i,j)=255;endifwatermark(i,j)<0watermark(i,j)=0;endendend[w2h2]=size(watermark);[w3h3]=size(imagew);p=1;q=1;mark=zeros(size(imagew));fori=1:w3:w2forj=1:h3:h2mark=mark+watermark(i:p*w3,j:q*h3);q=q+1;endp=p+1;q=1;endmark=mark/8;subplot(2,2,4);colormap(gray(256));image(mark);title('watermark');%showstheimageadaptivewatermarkimwrite(mark,gray(256),'watermark.bmp');%savestheimageadaptivewatermarkasabmpfile%%%%%%%%%%%%D??ü?à??%%%%%%%%%%%%%image1=imread(num2str(filename1));x0=image1;imaged=imread('marked_image.bmp');x2=imaged;%%%%%%%%%%%%%%%%%%%%%%??????è?á???ó?μ?D?o?μ?D???±è%%%%fz=sum(x0.*x0);fm=sum((x0-x2).*(x0-x2));SNR=-10*log(fm/fz)%%%%%%%%%%%%%%%%%%%%%?????ó???ê%%%%%%%%%%%%%%%%%%%%%%mark=imread('dmg2.tif');mark1=imread('watermark.bmp');[row,col]=size(mark);m1=mark(:);mm1=mark1(:);err=sum(sum(xor(m1',mm1')))/row*colfunction[D]=blockdwt2(A,W);[row,col]=size(A);k=0.007;[ca,ch,cv,cd]=dwt2(A,'db1');c1=[chcvcd];[h,w]=size(ca');[m,n]=size(c1');W=dmg(W,A);[caachhcvvcdd]=dwt2(W,'db1');W=caa;size(W);%Addingwatermarkimage.fori=1:hforj=1:wifW(i,j)==0a=-0.1;elsea=0.1;endCa(i,j)=ca(i,j)*(1+k*a);%<--------k*abs(double(c1(i,j)))*W(i,j);deolabilirendendD=double(idwt2(Ca,ch,cv,cd,'db1'));%Damgauretme%%imgew:Damgaimgesi%imge1:Orjinalimge%functionW=dmg(imgew,imge1);[wh]=size(imgew');[w1h1]=size(imge1');a=1;b=1;W=zeros(size(imge1'));fori=1:w:w1forj=1:h:h1W(i:a*w,j:b*h)=imgew';b=b+1;enda=a+1;b=1;endW=W';基于小波變換圖像水?。?)clearall;closeall;clc;M=256;%?-í???3¤?èN=64;%??ó?3¤?è[filename1,pathname]=uigetfile('*.*','selecttheimage');image1=imread(num2str(filename1));subplot(2,2,1);imshow(image1);title('originalimage');%orginalimageforwatermarkingimage1=double(image1);imagew=imread('dmg2.bmp');subplot(2,2,2);imshow(imagew);title('originalwatermark');%originalwatermark%??è???ó?[ca,ch,cv,cd]=dwt2(image1,'db1');[cas,chs,cvs,cds]=dwt2(ca,'db1');fori=1:Nforj=1:Nifimagew(i,j)==0a=-1;elsea=1;endCa(i,j)=cas(i,j)*(1+a*0.01);endendIM=idwt2(Ca,chs,cvs,cds,'db1');markedimage=double(idwt2(IM,ch,cv,cd,'db1'));%??ê???è?oó??ó?í???subplot(2,2,3);colormap(gray(256));image(markedimage);title('markedimage');imwrite(markedimage,gray(256),'watermarked.bmp','bmp');%ìáè???ó?image1=imread(num2str(filename1));image1=double(image1);imaged=imread('watermarked.bmp');[ca,ch,cv,cd]=dwt2(image1,'db1');[cas,chs,cvs,cds]=dwt2(ca,'db1');[caa,chh,cvv,cdd]=dwt2(imaged,'db1');[caas,chhs,cvvs,cdds]=dwt2(caa,'db1');forp=1:Nforq=1:Na=caas(p,q)-cas(p,q);ifa<0W(p,q)=0;elseW(p,q)=255;endendend%??ê?ìáè?μ???ó?subplot(2,2,4);colormap(gray(256));image(W);title('′óo???ó?í????Dìáè?μ???ó?');imwrite(W,gray(256),'watermark.bmp','bmp');%%%%%%%%%%%%D??ü?à??image1=imread(num2str(filename1));x0=image1;imaged=imread('watermarked.bmp');x2=imaged;%%%%%%%%%%%%%%%%%%%%%%??????è?á???ó?μ?D?o?μ?D???±è%%%%fz=sum(x0.*x0);fm=sum((x0-x2).*(x0-x2));SNR=-10*log(fm/fz)%%%%%%%%%%%%%%%%%%%%%?????ó???ê%%%%%%%%%%%%%%%%%%%%%%mark=imread('dmg2.bmp');mark1=imread('watermark.bmp');[row,col]=size(mark);m1=mark(:);mm1=mark1(:);err=sum(sum(xor(m1',mm1')))/row*colclearall;closeall;clc;[x,fs,nbits]=wavread('F:\?Dò?×÷òμ?à1?\ò??μ\2blues1.wav');[c,l]=wavedec(x,3,'db4');%èy??D?2¨·??aca3=appcoef(c,l,'db4',3);cd3=detcoef(c,l,3);cd2=detcoef(c,l,2);cd1=detcoef(c,l,1);x=ca3;%ìáè?μí?μ?μêylenx=length(x);%×÷?aí?2?D?o?%y=[0.02;0.02;0.02;0.02;0.02;0.02;0.02;0.02;0.02;0.02];%?áè???ó?D??¢mark=imread('F:\?Dò?×÷òμ?à1?\ò??μ\name.bmp');[row,col]=size(mark);w=mark(:);m=length(w');k=fix(lenx/10/m)*10;subplot(2,1,1);imshow(mark);title('??ó?í???','Fontsize',16,'color','blue');w1=w(1:m);a=0.01;fori=1:k:m*kx1=x(i:i+k-1);j=fix(i/k)+1;fort=1:3recordx(j,t)=x1(t);x1(t)=x1(t)*(1+a*w(j));x(i:i+k-1)=x1;endendc1=[x',cd3',cd2',cd1'];s1=waverec(c1,l,'db4');%6o?2¢μ?μ???è???ó?oóμ?ò??μD?o?%marked=[y;s1];wavwrite(s1,fs,nbits,'F:\?Dò?×÷òμ?à1?\ò??μ\em2blues1.wav');%??ó?ìáè?[x2,fs,nbits]=wavread('F:\?Dò?×÷òμ?à1?\ò??μ\em2blues1.wav');[cr,lr]=wavedec(x2,3,'db4');car3=appcoef(cr,lr,'db4',3);cdr3=detcoef(cr,lr,3);cdr2=detcoef(cr,lr,2);cdr1=detcoef(cr,lr,1);fori=1:k:m*kj=fix(i/k)+1;%5??ó?ìáè?w21=(car3(i)/recordx(j,1)-1)/a;w22=(car3(i+1)/recordx(j,2)-1)/a;w23=(car3(i+2)/recordx(j,3)-1)/a;w2(j)=(w21+w22+w23)/3;endw3=reshape(w2,row,col);subplot(2,1,2);imshow(w3);title('ìáè?μ???ó?í???','Fontsize',16,'color','blue');imwrite(w3,'watermark.bmp','bmp');%D??ü?à??[x0,fs,nbits]=wavread('F:\?Dò?×÷òμ?à1?\ò??μ\2blues1.wav');[x2,fs,nbits]=wavread('F:\?Dò?×÷òμ?à1?\ò??μ\em2blues1.wav');%%%%%%%%%%%%%%%%%%%%%%??????è?á???ó?μ?D?o?μ?D???±è%%%%fz=sum(x0.*x0);fm=sum((x0-x2).*(x0-x2));SNR=-10*log(fm/fz)%%%%%%%%%%%%%%%%%%%%%?????ó???ê%%%%%%%%%%%%%%%%%%%%%%mark=imread('F:\?Dò?×÷òμ?à1?\ò??μ\name.bmp');mark1=imread('F:\?Dò?×÷òμ?à1?\ò??μ\watermark.bmp');[row,col]=size(mark);m1=mark(:);mm1=mark1(:);err=sum(sum(xor(m1',mm1')))/row*col音視頻編碼說(shuō)明1音視頻編碼參數(shù)1.1音頻編碼參數(shù)音頻編碼格式采用AAC格式,其參數(shù)設(shè)置比較簡(jiǎn)單,主要設(shè)置參數(shù)如下:(1)音頻樣本格式的設(shè)置c->sample_fmt=AV_SAMPLE_FMT_S16;sample_fmt是一個(gè)enum類型,包含了多種樣本格式,樣本格式的設(shè)置應(yīng)保持與Android應(yīng)用層音頻采樣格式一致。此處,我們?cè)O(shè)置為AV_SAMPLE_FMT_S16,Android應(yīng)用層采樣格式也是16位的ENCODING_PCM_16BIT格式。(2)音頻碼率設(shè)置c->bit_rate=64000;此參數(shù)為應(yīng)用層提供參數(shù)接口,由應(yīng)用層根據(jù)編碼效果來(lái)設(shè)定。此處參考值為64000。(3)音頻采樣率設(shè)置c->sample_rate=44100;此參數(shù)為應(yīng)用層提供參數(shù)接口,由應(yīng)用層獲取實(shí)際機(jī)型可用的采樣率來(lái)決定。采樣率越低,音頻效果越差,反之,越好。音頻采樣率一般有8000,44100,47250,48000,47250,32000,11025,16000,22050等值,此處參考值為44100HZ,現(xiàn)在基本所有機(jī)器都支持44100采樣,而且音頻效果也很好。(4)音頻通道設(shè)置c->channels=2;此參數(shù)為應(yīng)用層提供參數(shù)接口,根據(jù)應(yīng)用層需求來(lái)設(shè)置。當(dāng)設(shè)置1時(shí)為單聲道模式,設(shè)置2時(shí)為立體聲道模式。此處參考值為2.1.2視頻編碼參數(shù)視頻編碼參數(shù)相對(duì)音頻編碼參數(shù)復(fù)雜,其中一些參數(shù)關(guān)系到視頻編碼的質(zhì)量和編碼速度,為此需要設(shè)置一套最優(yōu)的參數(shù)以確保質(zhì)量和速度達(dá)到一個(gè)平衡點(diǎn)。(1)視頻編碼基本參數(shù)設(shè)置<1>DEC_ID_H264;視頻編碼格式采用H264格式。<2>c->width=480;c->height=480;width和height兩個(gè)參數(shù)為應(yīng)用層提供參數(shù)接口,根據(jù)具體需求來(lái)設(shè)置編碼后視頻的大小,即最終視頻的width和height。應(yīng)用層也可以考慮通過(guò)調(diào)節(jié)width和height的大小來(lái)改變視頻編碼的速度,例如480*320的大小比480*480的大小編碼速度快很多。此處默認(rèn)是480*480大小。<3>c->time_base.den=15;c->time_base.num=1;這兩個(gè)參數(shù)決定視頻播放幀率,即每秒播放多少幀的視頻,time_base.num固定為1,time_base.den為應(yīng)用層提供參數(shù)接口。一般應(yīng)用層錄取視頻幀率和播放視頻幀率一致。此參數(shù)的設(shè)置需要考慮到編碼速度的問(wèn)題,經(jīng)過(guò)反復(fù)測(cè)試,15幀/s是一個(gè)比較合適的值。<4>c->pix_fmt=AV_PIX_FMT_YUV420P;視頻像素格式,采用AV_PIX_FMT_YUV420P格式。(2)重要參數(shù)設(shè)置以上視頻參數(shù)是必須設(shè)置的基本參數(shù),以下介紹的參數(shù)將會(huì)直接影響到視頻的質(zhì)量和編碼速度。詳細(xì)如下:<1>c->thread_count編碼線程數(shù),將幀分塊,由不同的線程去完成。此參數(shù)為應(yīng)用層提供參數(shù)接口,大小需要根據(jù)設(shè)備CPU核心數(shù)來(lái)動(dòng)態(tài)設(shè)定。經(jīng)過(guò)反復(fù)測(cè)試,此處大小設(shè)置為thread_count=CPU核心數(shù)*1.5時(shí)編碼速度達(dá)到比較好的水平。<2>opt_set_funcs系列函數(shù)的利用opt_set_funcs系列函數(shù)有以下10個(gè):intav_opt_set(void*obj,constchar*name,constchar*val,intsearch_flags);intav_opt_set_int(void*obj,constchar*name,int64_tval,intsearch_flags);intav_opt_set_double(void*obj,constchar*name,doubleval,intsearch_flags);intav_opt_set_q(void*obj,constchar*name,AVRationalval,intsearch_flags);intav_opt_set_bin(void*obj,constchar*name,constuint8_t*val,intsize,intsearch_flags);intav_opt_set_image_size(void*obj,constchar*name,intw,inth,intsearch_flags);intav_opt_set_pixel_fmt(void*obj,constchar*name,enumAVPixelFormatfmt,intsearch_flags);intav_opt_set_sample_fmt(void*obj,constchar*name,enumAVSampleFormatfmt,intsearch_flags);intav_opt_set_video_rate(void*obj,constchar*name,AVRationalval,intsearch_flags);intav_opt_set_channel_layout(void*obj,constchar*name,int64_tch_layout,intsearch_flags);我們可以在ffmpeg源碼庫(kù)libavutil\opt.h查看函數(shù)的聲明,目前只用到前兩個(gè)av_opt_set、av_opt_set_int來(lái)設(shè)置x264里的一些編碼參數(shù)。av_opt_set(c->priv_data,"preset","ultrafast",0);通過(guò)preset參數(shù)可以設(shè)置編碼速度的等級(jí),preset的級(jí)別有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo,從快到慢。其實(shí),這里的每個(gè)參數(shù)都是由一組x264參數(shù)設(shè)置組合而成。例如ultrafast參數(shù)是由以下參數(shù)設(shè)置組合的:-ultrafast:\n""--no-8x8dct--aq-mode0--b-adapt0\n""--bframes0--no-cabac--no-deblock\n""--no-mbtree--media--no-mixed-refs\n""--partitionsnone--rc-lookahead0--ref1\n""--scenecut0--subme0--trellis0\n""--no-weightb--weightp0\n"這些參數(shù)可以在x264源碼庫(kù)里x264.c文件中查看到。大部分參數(shù)的含義可以參看://x264-settings.wikispaces/x264+settings或者://wmnmtm.blog.163/blog/static/3824571420215673052227/.preset參數(shù)為應(yīng)用層也提供了參數(shù)接口,應(yīng)用層根據(jù)編碼速度和質(zhì)量的進(jìn)行選取合適的等級(jí)。經(jīng)過(guò)反復(fù)測(cè)試,設(shè)置為ultrafast這個(gè)值,再配合其他參數(shù)參考值能達(dá)到最優(yōu)效果。?av_opt_set(c->priv_data,"x264opts","force-cfr",0);設(shè)置force_crf參數(shù),此參數(shù)是設(shè)置tune參數(shù)zerolatency值中挖掘出來(lái)的。Zerolatency參數(shù)也是由一組參數(shù)組合而成,能起到的作用是解決延遲問(wèn)題,實(shí)現(xiàn)實(shí)時(shí)編碼。其組合參數(shù)如下:-zerolatency:\n""--bframes0--force-cfr--no-mbtree\n""--sync-lookahead0--sliced-threads\n""--rc-lookahead0\n"其中有的參數(shù)與ultrafast中的參數(shù)重復(fù),經(jīng)過(guò)反復(fù)測(cè)試,設(shè)置force_crf和設(shè)置tune值為zerolatency效果是一樣的。?av_opt_set_int(c->priv_data,"qp",qpValue,0);其中qpValue是一個(gè)int類型的值,qp表示固定量化因子,取值范圍0到51。經(jīng)常取值在20-40之間,越小質(zhì)量越好,要求的碼率越高,0表示無(wú)損壓縮。此參數(shù)為應(yīng)用層提供了參數(shù)接口,應(yīng)用層根據(jù)視頻質(zhì)量和編碼速度來(lái)選取合適的大小。經(jīng)過(guò)反復(fù)測(cè)試,取值25能達(dá)到質(zhì)量和速度的平衡。碼率控制的方法有三種,出了qp控制方法外還有bitrate及crf方法。三種碼率控制方法見(jiàn)下表1.表1.三種碼率控制方法對(duì)比說(shuō)明:起初使用的碼率控制方法是bitrate固定碼率的方法,其取值為W*h*15*2*0.07是參考doubango計(jì)算方法,其中w是視頻圖像的寬,h是視頻圖像的高,15是幀率,2是中等質(zhì)量等級(jí),0.07一個(gè)權(quán)重系數(shù),經(jīng)過(guò)反復(fù)測(cè)試取此值達(dá)到速度與質(zhì)量平衡時(shí)的速度并不是非常滿意,為了尋求更快的編碼速度,測(cè)試了qp方法和crf方法。測(cè)試crf方法采用默認(rèn)值23時(shí),速度比較慢,取值增大時(shí)質(zhì)量也變得很差,因此沒(méi)有找打一個(gè)好的平衡點(diǎn),舍棄了此種方法。最終選取了qp控制方法,當(dāng)取值為25時(shí),在1.2GHZ雙核CPU測(cè)試(本文中提到的測(cè)試都是基于此設(shè)備的)上速度和質(zhì)量達(dá)到預(yù)想效果,速度接近15幀/s。在開發(fā)中,這三種碼率控制的方法應(yīng)該根據(jù)實(shí)際需求來(lái)選取。1.3編碼參數(shù)設(shè)置總結(jié)對(duì)于音頻參數(shù)的設(shè)置比較簡(jiǎn)單,視頻參數(shù)的設(shè)置比較難,主要是因?yàn)橐紤]到視頻編碼速度的問(wèn)題。雖然之后的編碼處理方面也會(huì)有些問(wèn)題會(huì)影響編碼速度,但是設(shè)置好了編碼參數(shù)也就成功了一大半了。這些參數(shù)的設(shè)置都要根據(jù)實(shí)際的需求來(lái)設(shè)置,在沒(méi)有經(jīng)驗(yàn)的情況下需要反復(fù)的測(cè)試,找到最合適的參數(shù)值。2編碼設(shè)置完編碼參數(shù)和初始化其他工作后,就可以把采集的音視頻數(shù)據(jù)進(jìn)行編碼了。音頻編碼比較簡(jiǎn)單,在此不用介紹,下面主要介紹視頻的編碼工作。2.1視頻編碼的需求視頻編碼的需求如下:a.將移動(dòng)設(shè)備采集來(lái)的視頻數(shù)據(jù)像素格式轉(zhuǎn)變?yōu)锳V_PIX_FMT_YUV420P類型的格式;b.對(duì)視頻圖像大小進(jìn)行裁剪成目標(biāo)圖片大??;c.當(dāng)設(shè)備由橫屏變?yōu)樨Q屏錄像時(shí),需要對(duì)視頻圖像進(jìn)行旋轉(zhuǎn)操作;d.最后對(duì)處理好的視頻數(shù)據(jù)進(jìn)行真正的編碼,并寫入文件。2.2像素格式轉(zhuǎn)換(1)YUV420格式簡(jiǎn)介YUV主要用于優(yōu)化彩色視頻信號(hào)的傳輸,使其向后相容老式黑白電視。與RGB視頻信號(hào)傳輸相比,它最大的優(yōu)點(diǎn)在于只需占用極少的頻寬(RGB要求三個(gè)獨(dú)立的視頻信號(hào)同時(shí)傳輸)。其中“Y”表示明亮度(Luminance或Luma),也就是灰階值;而“U”和“V”表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用于指定像素的顏色。采用YUV色彩空間的重要性是它的亮度信號(hào)Y和色度信號(hào)U、V是分離的。如果只有Y信號(hào)分量而沒(méi)有U、V分量,那么這樣表示的圖像就是黑白灰度圖像。其主要的采樣格式有YCbCr4:2:0、YCbCr4:2:2、YCbCr4:1:1和YCbCr4:4:4。,在此,只介紹項(xiàng)目用到的YCbCr4:2:0。4:2:0表示2:1的水平取樣,沒(méi)有垂直采樣。現(xiàn)以圖1來(lái)直觀地表示描述YUV420的采樣方式,其中以黑點(diǎn)表示采樣該像素點(diǎn)的Y分量,以空心圓圈表示采用該像素點(diǎn)的UV分量例。圖1.YUV420采樣圖由圖可見(jiàn),YUV4:2:0采樣,每四個(gè)Y共用一組UV分量。由此可計(jì)算出YUV420的存儲(chǔ)大小,如640*480大小的圖像其存儲(chǔ)大小為(640*480*3)>>1字節(jié),即1.5倍的width*height。其中,Y分量:(640*480)個(gè)字節(jié);U(Cb)分量:(640*480>>2)個(gè)字節(jié);V(Cr)分量:(640*480>>2)個(gè)字節(jié)。(2)YUV420SP格式轉(zhuǎn)YUV420P格式Y(jié)UV420SP格式與YUV420P格式都是屬于YUV420的格式,它們所占存儲(chǔ)空間大小都是width*height*1.5,所不同的是UV兩個(gè)分量的存儲(chǔ)結(jié)構(gòu)。例如一個(gè)分辨率為8*4的YUV圖像,其存儲(chǔ)結(jié)構(gòu)分別如圖2、圖3所示。圖2.YUV420SP格式存儲(chǔ)結(jié)構(gòu)圖圖3.YUV420P格式存儲(chǔ)結(jié)構(gòu)圖由圖2、圖3可以清楚的看到,Y分量的存儲(chǔ)方式是一樣的,但UV兩個(gè)分量在420SP格式和420P格式中存儲(chǔ)方式完全不一樣。在420SP中,UV是交替出現(xiàn)的,而在420P中UV是U分量存儲(chǔ)完后再存儲(chǔ)V分量。分析清楚了不同之處,然后將420SP轉(zhuǎn)換為420P格式將會(huì)很簡(jiǎn)單。其轉(zhuǎn)換算法代碼如下:voidYUV420SPToYUV420P(uint8_t*yuv420sp,uint8_t*yuv420,intwidth,intheight){intPixelsCount=width*height;inti=0,j=0;if(yuv420sp==NULL||yuv420==NULL){//copyYfor(i=0;i<PixelsCount;i++){*(yuv420+i)=*(yuv420sp+i);}//copyCb(U)i=0;for(j=0;j<PixelsCount/2;j+=2){*(yuv420+(i+PixelsCount*5/4))=*(yuv420sp+(j+PixelsCount));i++;}//copyCr(V)i=0;for(j=1;j<PixelsCount/2;j+=2){*(yuv420+(i+PixelsCount))=*(yuv420sp+(j+PixelsCount));i++;}}return;}(3)項(xiàng)目中的應(yīng)用在Android移動(dòng)設(shè)備中,默認(rèn)的像素采樣格式為YCbCr_420_SP即YUV420SP格式,不過(guò)在APIlevel8時(shí)用NV21格式來(lái)代替了。NV21也屬于YUV420格式,經(jīng)過(guò)測(cè)試,其采樣結(jié)構(gòu)與YUV420SP是一致的。Android設(shè)備攝像頭采樣還有其他像素格式,如RGB等。但是最通用的采樣格式還是420SP,經(jīng)過(guò)測(cè)試,其他格式的采樣圖像會(huì)出現(xiàn)不兼容情況。因此本項(xiàng)目android應(yīng)用層中采用的是YUV420SP格式。然而,查看ffmpeg源碼庫(kù)里像素支持的格式時(shí)發(fā)現(xiàn),并沒(méi)有與YUV420SP對(duì)應(yīng)的格式,只有YUV420P格式與其最接近,存儲(chǔ)大小一致,這樣格式轉(zhuǎn)換也比較容易。Ffmpeg庫(kù)提供了一個(gè)通用的圖像格式轉(zhuǎn)換大小轉(zhuǎn)換的方法,如下:intsws_scale(structSwsContext*c,constuint8_t*constsrcSlice[],constintsrcStride[],intsrcSliceY,intsrcSliceH,uint8_t*constdst[],constintdstStride[]);第一個(gè)參數(shù)是是由sws_getContext方法獲得,第二個(gè)參數(shù)和第六個(gè)參數(shù)分別是指向轉(zhuǎn)換前與轉(zhuǎn)換后的buffer,第三個(gè)參數(shù)和第七個(gè)參數(shù)分別是轉(zhuǎn)換前與轉(zhuǎn)換后的linesize大小,第四個(gè)參數(shù)設(shè)置為0,第五個(gè)參數(shù)是原圖像的高度。調(diào)用此方法可以很方便的進(jìn)行像素格式的轉(zhuǎn)換以及圖片大小的轉(zhuǎn)換,通過(guò)查看ffmpeg源碼庫(kù)里swscale.c文件中sws_scale方法的定義,正如前面所說(shuō),它是一個(gè)通用的格式轉(zhuǎn)換方法,為了保證通用,因此設(shè)計(jì)比較復(fù)雜,考慮比較全面,然而在此項(xiàng)目中我們僅僅只需要將YUV420SP轉(zhuǎn)換為YUV420P格式。為了提高性能和整個(gè)編碼速度必須為YUV420SP轉(zhuǎn)換YUV420P提供一個(gè)專門的轉(zhuǎn)換方法,即(2)中提出的方法。經(jīng)過(guò)測(cè)試,使用專門的轉(zhuǎn)換方法比調(diào)用ffmpeg庫(kù)里的sws_scale方法150幀的視頻時(shí)間上節(jié)約了近2秒。當(dāng)圖片大小更大時(shí),sws_scale方法時(shí)間將會(huì)花費(fèi)更久。因此本項(xiàng)目最終選擇(2)中的轉(zhuǎn)換方法。2.3視頻裁剪在2.2節(jié)中提到了sws_scale方法可以轉(zhuǎn)換圖像的大小,但當(dāng)采樣圖像大小比較大而最

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論