亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種基于FPGA的圖像旋轉(zhuǎn)方法及裝置與流程

文檔序號(hào):12126092閱讀:2107來源:國(guó)知局
一種基于FPGA的圖像旋轉(zhuǎn)方法及裝置與流程

本發(fā)明涉及FPGA數(shù)字圖像處理領(lǐng)域,更具體地說,涉及一種基于FPGA的圖像旋轉(zhuǎn)方法及裝置。



背景技術(shù):

數(shù)字穩(wěn)像在無人機(jī)拍攝等眾多領(lǐng)域有關(guān)廣泛的需求。而實(shí)際中數(shù)字穩(wěn)像一般是把圖像的抖動(dòng)分解成圖像的平穩(wěn)與圖像的旋轉(zhuǎn)。圖像的平移實(shí)現(xiàn)簡(jiǎn)單,但圖像的旋轉(zhuǎn),由于是實(shí)時(shí)的穩(wěn)像,因此實(shí)際上是要對(duì)視頻作實(shí)時(shí)的旋轉(zhuǎn)處理。而對(duì)視頻作實(shí)時(shí)的旋轉(zhuǎn)處理,其旋轉(zhuǎn)處理難度會(huì)隨著旋轉(zhuǎn)角度的增大而增大,所以目前普遍的嵌入式芯片只能作簡(jiǎn)單的90度或者80度旋轉(zhuǎn),而無法作其它角度的旋轉(zhuǎn),或者專門的圖像處理芯片的數(shù)字防抖也只能作微小角度的旋轉(zhuǎn),從而使得其數(shù)字防抖的效果不佳。另外,在現(xiàn)有的圖像旋轉(zhuǎn)方法中,由于旋轉(zhuǎn)的特性,從而導(dǎo)致了在圖像旋轉(zhuǎn)的處理過程中對(duì)原始圖像數(shù)據(jù)的讀取是隨機(jī)的,特別是對(duì)于大角度的旋轉(zhuǎn),則會(huì)造成緩存資源消耗大的問題,且在旋轉(zhuǎn)后對(duì)圖像的存儲(chǔ)存在大量的冗余操作,進(jìn)而需要更大的實(shí)現(xiàn)代價(jià)或者無法實(shí)現(xiàn)大角度的圖像旋轉(zhuǎn)。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明要解決的技術(shù)問題在于,針對(duì)現(xiàn)有技術(shù)的上述缺陷,提供一種基于FPGA的圖像旋轉(zhuǎn)方法及裝置。

本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:構(gòu)造一種基于FPGA的圖像旋轉(zhuǎn)方法,所述基于FPGA的圖像旋轉(zhuǎn)方法包括以下步驟:

S1:對(duì)存儲(chǔ)在外部存儲(chǔ)器DDR中的原圖像進(jìn)行分塊處理,獲得M*N塊原子圖像塊,M為大于1的正整數(shù),N為大于1的正整數(shù);

S2:將一塊所述原子圖像塊存儲(chǔ)在輸入緩存塊中,所述輸入緩存塊包括多個(gè)存儲(chǔ)器;

S3:根據(jù)旋轉(zhuǎn)角度對(duì)一塊所述原子圖像塊進(jìn)行旋轉(zhuǎn)得到一塊旋轉(zhuǎn)子圖像塊,并將一塊所述旋轉(zhuǎn)子圖像塊存儲(chǔ)在輸出緩存塊中,所述輸出緩存塊包括多個(gè)存儲(chǔ)器;

S4:將存儲(chǔ)在所述輸出緩存塊中的執(zhí)行了旋轉(zhuǎn)操作后的一塊所述旋轉(zhuǎn)子圖像塊存儲(chǔ)在輸出緩存器中;

S5:重復(fù)執(zhí)行步驟S2至步驟S4,直至M*N塊所述旋轉(zhuǎn)子圖像塊全部存儲(chǔ)在輸出緩存器中,得到最終的旋轉(zhuǎn)圖像。

優(yōu)選地,所述步驟S1包括:

根據(jù)所述輸入緩存塊中的存儲(chǔ)器的大小確定原子圖像塊的大小,對(duì)所述原圖像進(jìn)行分塊處理。

優(yōu)選地,所述步驟S2包括:

采用突發(fā)模式將存儲(chǔ)在外部存儲(chǔ)器DDR中的所述原子圖像塊讀入到所述輸入緩存塊中,且在每次讀取所述原子圖像塊時(shí),比所述原子圖像塊多讀取2行2列。

優(yōu)選地,所述步驟S3包括:

根據(jù)旋轉(zhuǎn)角度以所述原子圖像塊的中心點(diǎn)為旋轉(zhuǎn)中心進(jìn)行旋轉(zhuǎn),并將旋轉(zhuǎn)后的所述旋轉(zhuǎn)子圖像塊存儲(chǔ)在所述輸出緩存塊中。

優(yōu)選地,所述步驟S3還包括:

根據(jù)所述原子圖像塊的中心點(diǎn)在所述原圖像中的坐標(biāo)及所述旋轉(zhuǎn)角度,計(jì)算得到旋轉(zhuǎn)后的所述旋轉(zhuǎn)子圖像塊的中心點(diǎn)在輸出緩存塊中的坐標(biāo);

根據(jù)所述旋轉(zhuǎn)子圖像塊在輸出緩存塊中的坐標(biāo)及所述旋轉(zhuǎn)子圖像塊的大小確定存儲(chǔ)在所述輸出緩存塊中的所述旋轉(zhuǎn)子圖像塊寫入到所述輸出緩存器中的起始地址。

優(yōu)選地,所述步驟S4包括:

根據(jù)所述起始地址將存儲(chǔ)在所述輸出緩存塊中的所述旋轉(zhuǎn)子圖像塊寫入到所述輸出緩存器中,直至一塊所述旋轉(zhuǎn)子圖像塊完全寫入所述輸出緩存器中。

優(yōu)選地,所述步驟S4還包括:

采用突發(fā)模式根據(jù)所述起始地址將所述旋轉(zhuǎn)子圖像塊寫入到所述輸出緩存器中。

優(yōu)選地,在所述步驟S4前還包括:

根據(jù)所述旋轉(zhuǎn)子圖像塊的旋轉(zhuǎn)坐標(biāo)通過反向旋轉(zhuǎn)得到所述旋轉(zhuǎn)子圖像塊對(duì)應(yīng)原子圖像塊在所述輸入緩存塊中的反向旋轉(zhuǎn)坐標(biāo);

若所述反向旋轉(zhuǎn)坐標(biāo)超出了所述原子圖像塊的坐標(biāo)范圍,則對(duì)與所述旋轉(zhuǎn)子圖像塊的旋轉(zhuǎn)坐標(biāo)對(duì)應(yīng)的點(diǎn)增加數(shù)據(jù)有效標(biāo)志,所述數(shù)據(jù)有效標(biāo)志為0。

優(yōu)選地,每一所述原子圖像塊為正方形,且邊長(zhǎng)為奇數(shù)。

本發(fā)明還提供一種基于FPGA的圖像旋轉(zhuǎn)裝置,所述基于FPGA的圖像旋轉(zhuǎn)裝置包括:

分塊處理單元,用于將存儲(chǔ)在外部存儲(chǔ)器DDR中的原圖像進(jìn)行分塊處理,獲取M*N塊原子圖像塊,M為大于1的正整數(shù),N為大于1的正整數(shù);

第一存儲(chǔ)單元,用于將一塊所述原子圖像塊存儲(chǔ)在輸入緩存塊中,所述輸入緩存塊包括多個(gè)存儲(chǔ)器;

旋轉(zhuǎn)單元,用于根據(jù)旋轉(zhuǎn)角度對(duì)一塊所述原子圖像塊進(jìn)行旋轉(zhuǎn)得到一塊旋轉(zhuǎn)子圖像塊,并將一塊所述旋轉(zhuǎn)子圖像塊存儲(chǔ)在輸出緩存塊中,所述輸出緩存塊包括多個(gè)存儲(chǔ)器;

第二存儲(chǔ)單元,用于將存儲(chǔ)在所述輸出緩存塊中的執(zhí)行了旋轉(zhuǎn)操作后的一塊所述旋轉(zhuǎn)子圖像塊存儲(chǔ)在輸出緩存器中;

重復(fù)執(zhí)行單元,用于重復(fù)執(zhí)行所述第一存儲(chǔ)單元、所述旋轉(zhuǎn)存儲(chǔ)單元以及所述第二存儲(chǔ)單元的執(zhí)行步驟,直至M*N塊所述旋轉(zhuǎn)子圖像塊全部存儲(chǔ)在輸出緩存器中,得到最終的旋轉(zhuǎn)圖像。

實(shí)施本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法及裝置,具有以下有益效果:本方法通過根據(jù)原圖大小及存儲(chǔ)器的資源容量以原圖分塊為原則,對(duì)分塊后的子圖像塊單獨(dú)進(jìn)行旋轉(zhuǎn),同時(shí)記錄數(shù)據(jù)的有效性,旋轉(zhuǎn)后的圖像輸出到緩存器時(shí)結(jié)合數(shù)據(jù)有效性進(jìn)行突發(fā)模式的讀/寫操作,同時(shí)確定旋轉(zhuǎn)后的圖像塊在輸出緩存器中的坐標(biāo),實(shí)現(xiàn)了在FPGA上以最小代價(jià)對(duì)圖像進(jìn)行任意角度的快速旋轉(zhuǎn),達(dá)到了既能以任意角度快速旋轉(zhuǎn)、節(jié)約成本、減少資源消耗,又能實(shí)現(xiàn)實(shí)時(shí)穩(wěn)像的目的,提升了用戶體驗(yàn)。

附圖說明

下面將結(jié)合附圖及實(shí)施例對(duì)本發(fā)明作進(jìn)一步說明,附圖中:

圖1是本發(fā)明基于FPGA的圖像旋轉(zhuǎn)方法一實(shí)施例的流程示意圖;

圖2是本發(fā)明圖像旋轉(zhuǎn)裝置一實(shí)施例的結(jié)構(gòu)示意圖;

圖3是本發(fā)明基于FPGA的圖像旋轉(zhuǎn)方法另一實(shí)施例的圖像分塊旋轉(zhuǎn)示意圖;

圖4是本發(fā)明基于FPGA的圖像旋轉(zhuǎn)方法另一實(shí)施例的一塊子圖像塊旋轉(zhuǎn)處理示意圖;

圖5是本發(fā)明基于FPGA的圖像旋轉(zhuǎn)方法另一實(shí)施例的一塊子圖像塊旋轉(zhuǎn)示意圖;

圖6是本發(fā)明基于FPGA的圖像旋轉(zhuǎn)方法另一實(shí)施例的旋轉(zhuǎn)子圖像塊大小示意圖;

圖7是本發(fā)明基于FPGA的圖像旋轉(zhuǎn)方法另一實(shí)施例的一塊子圖像旋轉(zhuǎn)示意圖;

圖8是本發(fā)明基于FPGA的圖像旋轉(zhuǎn)方法另一實(shí)施例的子圖像塊讀取示意圖;

圖9是本發(fā)明基于FPGA的圖像旋轉(zhuǎn)方法基于FPGA實(shí)現(xiàn)原理框圖。

具體實(shí)施方式

為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖和具體實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步的詳細(xì)說明。應(yīng)當(dāng)理解,此處描述的具體實(shí)施例僅用于解釋本發(fā)明,并不用于限定本發(fā)明。

如圖1所示,在本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法流程示意圖中,本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法包括以下步驟:

S1:對(duì)存儲(chǔ)在外部存儲(chǔ)器DDR中的原圖像進(jìn)行分塊處理,獲得M*N塊原子圖像塊,M為大于1的正整數(shù),N為大于1的正整數(shù)。

具體地,在步驟S1中,對(duì)存儲(chǔ)在外部存儲(chǔ)器DDR中的原圖像進(jìn)行分塊可根據(jù)原圖像每個(gè)像素點(diǎn)進(jìn)行劃分,也可以按塊對(duì)原圖像進(jìn)行劃分,且每一塊的大小可根據(jù)存儲(chǔ)器的大小進(jìn)行劃分。在本發(fā)明的實(shí)施例中,存儲(chǔ)器可以為由FPGA內(nèi)部的多個(gè)BRAM組成,則按照存儲(chǔ)器的大小進(jìn)行劃分,即為根據(jù)多個(gè)BRAM組成的容量對(duì)原圖像進(jìn)行分塊。例如,以xilinx 7系列FPGA為例,F(xiàn)PGA內(nèi)部的1塊BRAM的容量為36Kb,如果每個(gè)像素的位寬為32bit,則1塊BRAM可以存儲(chǔ)36*1024bit/32bit=1152個(gè)像素,原圖像為5百萬像素的圖像有2592*1944=5038848個(gè)像素。

如果采用4塊BRAM作為一個(gè)存儲(chǔ)器,則該存儲(chǔ)器可以存儲(chǔ)的最大子圖像塊的像素?cái)?shù)為1152*4=4608個(gè),則5百萬像素原圖像最少需要分成5038848/4608=1074塊。在實(shí)際進(jìn)行原圖像分塊時(shí),需根據(jù)FPGA內(nèi)部的BRAM的數(shù)量確定一個(gè)存儲(chǔ)器的大小,進(jìn)而對(duì)原圖像進(jìn)行分塊。例如,可以將5百萬像素原圖像分成水平32塊*垂直37塊,則每個(gè)原子圖像塊的大小為水平m=81像素*n=53像素,則4塊BRAM組成的一個(gè)存儲(chǔ)器可以存儲(chǔ)83*55(比m,n各大2,即存儲(chǔ)器比原子圖像塊多2列、2行)。

如果采用8塊BRAM作為一個(gè)存儲(chǔ)器,則存儲(chǔ)器可以存儲(chǔ)的最大子圖像塊的像素?cái)?shù)為1152*8=9216個(gè),則5百萬像素原圖像最少需要分成5038848/9216=547塊。在實(shí)際進(jìn)行原圖像分塊時(shí),需根據(jù)FPGA內(nèi)部的BRAM的數(shù)量確定一個(gè)存儲(chǔ)器的大小,進(jìn)而對(duì)原圖像進(jìn)行分塊。例如,可以將5百萬像素原圖像分成水平28塊*垂直24塊,每個(gè)原子圖像塊的大小為水平m=95像素*n=81像素,則4塊BRAM組成的存儲(chǔ)器可以存儲(chǔ)97*83(比m,n各大2,即存儲(chǔ)器比原子圖像塊多2列、2行),這樣原子圖像塊的總數(shù)比前面所述的4塊BRAM作為一個(gè)存儲(chǔ)器時(shí)的原子圖像塊的總數(shù)要少,但BRAM的需求數(shù)量從4個(gè)提高到了8個(gè)。

S2:將一塊原子圖像塊存儲(chǔ)在輸入緩存塊中,所述輸入緩存塊包括多個(gè)存儲(chǔ)器。

具體地,在步驟S1中,對(duì)于5百萬像素的原圖像分成水平32塊*垂直36塊,輸入緩存塊中包括多個(gè)BRAM組成的存儲(chǔ)器,每次只存儲(chǔ)一塊原子圖像塊m=83像素*n=56像素在多個(gè)BRAM組成的存儲(chǔ)器中。

S3:根據(jù)旋轉(zhuǎn)角度對(duì)一塊原子圖像塊進(jìn)行旋轉(zhuǎn)得到一塊旋轉(zhuǎn)子圖像塊,并將一塊旋轉(zhuǎn)子圖像塊存儲(chǔ)在輸出緩存塊中,所述輸出緩存塊包括多個(gè)存儲(chǔ)器。

S4:將存儲(chǔ)在輸出緩存塊中的執(zhí)行了旋轉(zhuǎn)操作后的一塊旋轉(zhuǎn)子圖像塊存儲(chǔ)在輸出緩存器中。

S5:重復(fù)執(zhí)行步驟S2至步驟S4,直至M*N塊旋轉(zhuǎn)子圖像塊全部存儲(chǔ)在輸出緩存器中,得到最終的旋轉(zhuǎn)圖像。

具體地,在本發(fā)明的實(shí)施例中,本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法為基于FPGA的基于FPGA的圖像旋轉(zhuǎn)方法,即本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法是在FPGA上實(shí)現(xiàn)的,其對(duì)圖像的分塊、旋轉(zhuǎn)及輸出均可在FPGA中實(shí)現(xiàn)。且在本發(fā)明的實(shí)施例中,對(duì)原子圖像塊的旋轉(zhuǎn)處理可采取并行的模式,也就是說,當(dāng)FPGA中有較多BRAM時(shí),可根據(jù)實(shí)際應(yīng)用,由BRAM組成多個(gè)存儲(chǔ)器并行進(jìn)行旋轉(zhuǎn)處理。

進(jìn)一步地,步驟S1包括:根據(jù)輸入緩存塊中的存儲(chǔ)器的大小確定原子圖像塊的大小對(duì)原圖像進(jìn)行分塊處理。具體地,在本發(fā)明的實(shí)施例中,輸入緩存塊包括多個(gè)存儲(chǔ)器,存儲(chǔ)器可以為由FPGA內(nèi)部的多個(gè)BRAM組成,其大小由所使用的FPGA所能分配給用于圖像旋轉(zhuǎn)存儲(chǔ)子圖像塊的BRAM的數(shù)量決定,本發(fā)明對(duì)存儲(chǔ)器的大小不作具體的限定,可根據(jù)實(shí)際處理進(jìn)行確定。在本發(fā)明的實(shí)施例中,BRAM可為36Kb等??梢岳斫獾?,例如,以xilinx 7系列FPGA為例,F(xiàn)PGA內(nèi)部的1塊BRAM的容量為36Kb,如果每個(gè)像素的位寬為32bit,則1塊BRAM可以存儲(chǔ)36*1024bit/32bit=1152個(gè)像素,原圖像為5百萬像素的圖像有2592*1944=5038848個(gè)像素。

如果采用4塊BRAM作為一個(gè)存儲(chǔ)器,則該存儲(chǔ)器可以存儲(chǔ)的最大子圖像塊的像素?cái)?shù)為1152*4=4608個(gè),則5百萬像素原圖像最少需要分成5038848/4608=1074塊。在實(shí)際進(jìn)行原圖像分塊時(shí),需根據(jù)FPGA內(nèi)部的BRAM的數(shù)量確定一個(gè)存儲(chǔ)器的大小,進(jìn)而對(duì)原圖像進(jìn)行分塊。例如,可以將5百萬像素原圖像分成水平32塊*垂直37塊,則每個(gè)原子圖塊的大小為水平m=81像素*n=53像素,則4塊BRAM組成的一個(gè)存儲(chǔ)器可以存儲(chǔ)83*55(比m,n各大2,即存儲(chǔ)器比原子圖像塊多2列、2行)。

在一些實(shí)施例中,步驟S2包括:采用突發(fā)模式將存儲(chǔ)在外部存儲(chǔ)器DDR中的原子圖像塊讀入到輸入緩存塊中,且在每次讀取原子圖像塊時(shí),比原子圖像塊多讀取2行2列。例如,前述實(shí)施例中,假設(shè)M0為分塊后的第一塊原子圖像塊,則讀取該原子圖像塊時(shí)比該原子圖像塊的大小多讀取2行2列。在本發(fā)明的實(shí)施例中,采取讀取原子圖像塊的數(shù)據(jù)時(shí)多讀取2行2列的數(shù)據(jù)讀取方式實(shí)際是對(duì)原子圖像塊進(jìn)行邊緣處理,從而可使其大旋轉(zhuǎn)后得到正常的旋轉(zhuǎn)輸出,實(shí)現(xiàn)了無缺失旋轉(zhuǎn)的目的。另外,在本發(fā)明的實(shí)施例中,讀取原子圖像塊時(shí)采用的是突發(fā)(burst)的模式。突發(fā)是指在同一行中相鄰的存儲(chǔ)單元連續(xù)進(jìn)行數(shù)據(jù)傳輸?shù)姆绞?,連續(xù)傳輸?shù)闹芷诰褪峭话l(fā)長(zhǎng)度,即burst length。采集突發(fā)模式,在進(jìn)行突發(fā)傳輸時(shí)只要指定起始列地址與突發(fā)長(zhǎng)度,內(nèi)存就會(huì)依次地自動(dòng)對(duì)后面相應(yīng)數(shù)量的存儲(chǔ)單元進(jìn)行讀/寫操作,而不再需要控制器連續(xù)提供列地址。因此,在本發(fā)明的實(shí)施例中采用突發(fā)模式讀取原子圖像塊實(shí)現(xiàn)了順序的DDR讀取地址,即從左到右,從上到下,從而使得讀取到輸入緩存塊中的原子圖像塊是從第一塊原子圖像塊開始依次按順序讀取的,避免了隨機(jī)讀取的問題,從而大大提高了處理速度,減少所需的存儲(chǔ)資源。

在一些實(shí)施例中,步驟S3包括:根據(jù)旋轉(zhuǎn)角度以原子圖像塊的中心點(diǎn)為旋轉(zhuǎn)中心進(jìn)行旋轉(zhuǎn),并將旋轉(zhuǎn)后的旋轉(zhuǎn)子圖像存儲(chǔ)在輸出緩存塊中。在本發(fā)明的實(shí)施例中,假設(shè)旋轉(zhuǎn)角度為a,以原子圖像塊的中心為中心進(jìn)行角度為a的矩陣旋轉(zhuǎn)運(yùn)算,得到旋轉(zhuǎn)a角度后的旋轉(zhuǎn)子圖像塊,并將旋轉(zhuǎn)a角度后的旋轉(zhuǎn)子圖像塊存儲(chǔ)在輸出緩存塊中。進(jìn)一步地,在該步驟S3執(zhí)行的同時(shí),即在步驟S4開始前,由于本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法是以將原圖像分塊后對(duì)每一塊原子圖像塊進(jìn)行單獨(dú)旋轉(zhuǎn)的,所以在最后輸出的圖像中會(huì)帶有非圖像內(nèi)容,即相當(dāng)于無效的數(shù)據(jù),而為了避免在輸出緩存器中寫入無效數(shù)據(jù),占用內(nèi)存,本發(fā)明則采用增加無效使能的標(biāo)志,以使無效數(shù)據(jù)不被寫入緩存器中。可以理解地,具體為,根據(jù)旋轉(zhuǎn)子圖像塊的旋轉(zhuǎn)坐標(biāo)通過反向旋轉(zhuǎn)得到旋轉(zhuǎn)子圖像塊對(duì)應(yīng)原子圖像塊在輸入緩存塊中的反向旋轉(zhuǎn)坐標(biāo),如果反向旋轉(zhuǎn)坐標(biāo)超出了原子圖像塊的坐標(biāo)范圍(也就是說,如果反向旋轉(zhuǎn)坐標(biāo)在原子圖像塊的坐標(biāo)內(nèi)沒有對(duì)應(yīng)的坐標(biāo)),則對(duì)該旋轉(zhuǎn)子圖像塊的旋轉(zhuǎn)坐標(biāo)對(duì)應(yīng)的點(diǎn)增加數(shù)據(jù)有效標(biāo)志,該數(shù)據(jù)有效標(biāo)志為0。在具體的實(shí)施例中,如果在輸入緩存塊沒有對(duì)應(yīng)坐標(biāo)的圖像數(shù)據(jù),則該旋轉(zhuǎn)坐標(biāo)對(duì)應(yīng)的數(shù)據(jù)為無效數(shù)據(jù),并置該點(diǎn)為0,假設(shè)為strobe(數(shù)據(jù)有效標(biāo)志),則在寫入輸出緩存器時(shí)strobe為0,即不寫入輸出緩存器中,也就是說,在輸入緩存塊中除了存儲(chǔ)原圖像的像素值外,還需存儲(chǔ)對(duì)應(yīng)的像素的數(shù)據(jù)有效數(shù)據(jù)有效標(biāo)志strobe信號(hào)。

在一些實(shí)施例中,步驟S3還包括:根據(jù)原子圖像塊的中心點(diǎn)在原圖像中的坐標(biāo)及旋轉(zhuǎn)角度,計(jì)算得到旋轉(zhuǎn)后的旋轉(zhuǎn)子圖像塊的中心點(diǎn)在輸出緩存塊中的坐標(biāo);根據(jù)旋轉(zhuǎn)子圖像塊在輸出緩存塊中的坐標(biāo)及旋轉(zhuǎn)子圖像塊的大小確定存儲(chǔ)在所述輸出緩存塊中的旋轉(zhuǎn)子圖像塊寫入到輸出緩存器中的起始地址。具體地,將原子圖像塊的中心點(diǎn)在原圖像中的坐標(biāo),以原圖像的中心旋轉(zhuǎn)a角度,得到旋轉(zhuǎn)后的旋轉(zhuǎn)子圖像塊中心點(diǎn)在輸出緩存塊中的坐標(biāo),并以此坐標(biāo)推測(cè)出旋轉(zhuǎn)子圖像塊在輸出緩存器中的起始位置,即起始地址。

在一些實(shí)施例中,步驟S4包括:根據(jù)起始地址將存儲(chǔ)在輸出緩存塊中的旋轉(zhuǎn)子圖像塊寫入到輸出緩存器中,直至一個(gè)旋轉(zhuǎn)子圖像塊完全寫入輸出緩存器中。

在一些實(shí)施例中,步驟S4還包括:采用突發(fā)的模式根據(jù)起始地址將旋轉(zhuǎn)子圖像塊寫入到輸出緩存器中。

在一些實(shí)施例中,本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法中所劃分的每一塊原子圖像塊為正方形,且邊長(zhǎng)為奇數(shù)。

進(jìn)一步地,本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法為基于FPGA的基于FPGA的圖像旋轉(zhuǎn)方法,其中所指的輸入緩存塊中的存儲(chǔ)器和輸出緩存塊中的存儲(chǔ)器為由FPGA內(nèi)部的多個(gè)BRAM組成的存儲(chǔ)器,輸出緩存器為FPGA的擴(kuò)展存儲(chǔ)器,即外部存儲(chǔ)器DDR。

實(shí)施本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法,通過采用對(duì)原圖像進(jìn)行分塊為基準(zhǔn),單獨(dú)對(duì)分塊后的原子圖像塊進(jìn)行旋轉(zhuǎn)并采用burst的方式讀取圖像數(shù)據(jù),進(jìn)而解決了一般的基于FPGA的圖像旋轉(zhuǎn)方法中從DDR讀取/寫入數(shù)據(jù)效率低、速度慢的瓶頸問題。而且在本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法在原子圖像塊完成旋轉(zhuǎn)后得到旋轉(zhuǎn)子圖像塊并存儲(chǔ)在BRAM中,再通過采用burst寫的方式將旋轉(zhuǎn)子圖像塊寫入輸出緩存器DDR中,同時(shí)在對(duì)旋轉(zhuǎn)子圖像塊進(jìn)行寫入DDR的操作時(shí)由于采用了數(shù)據(jù)有效數(shù)據(jù)有效標(biāo)志,使得在將旋轉(zhuǎn)子圖像塊的數(shù)據(jù)寫入DDR中時(shí)沒有冗余寫入,且采用burst方式可使旋轉(zhuǎn)速度不受旋轉(zhuǎn)角度的影響。每個(gè)原子圖像塊按正常的方式進(jìn)行旋轉(zhuǎn)處理后,通過原子圖像塊中心點(diǎn)定位輸出旋轉(zhuǎn)子圖像塊在輸出緩存塊BRAM中的坐標(biāo),并配合圖像塊邊緣處理(即在讀取原子圖像塊的數(shù)據(jù)里,每一塊原子圖像塊都多取2行2列),以得到正常的旋轉(zhuǎn)輸出。另外,采用本方法輸出的圖像寫入DDR與最終輸出的圖像尺寸無關(guān),因?yàn)楸痉椒ㄊ菍?duì)整圖像進(jìn)行旋轉(zhuǎn),最終輸出只需要在DDR的輸出緩存中開窗取數(shù)據(jù)即可。而且,本方法在將讀取原子圖像塊及寫入旋轉(zhuǎn)子圖像塊的過程中都采用了burst的模式,且根據(jù)旋轉(zhuǎn)后的旋轉(zhuǎn)子圖像塊的大小及坐標(biāo)確定了輸出緩存塊中旋轉(zhuǎn)子圖像塊寫入到DDR中的起始地址,從而確保了將圖像分塊單獨(dú)旋轉(zhuǎn)后寫入到DDR中的旋轉(zhuǎn)后的旋轉(zhuǎn)子圖像塊按與原子圖像塊在原圖像中的相應(yīng)位置的分布,即本方法讀取原子圖像塊和輸出(寫入)旋轉(zhuǎn)子圖像塊都是順序執(zhí)行的,從而保證了旋轉(zhuǎn)子圖像塊存儲(chǔ)在DDR中時(shí)按順序排布,而不是隨機(jī)排布,進(jìn)而得到最終的旋轉(zhuǎn)圖像。

另一方面,在追求圖像處理速度的嵌入式應(yīng)用場(chǎng)合,如果沒有專門的圖像處理芯片可實(shí)現(xiàn)客戶需求時(shí),往往采用FPGA專門定制邏輯電路來實(shí)現(xiàn)客戶的特殊需要。經(jīng)過FPGA的前期實(shí)現(xiàn)及驗(yàn)證,后期在有大批量需求時(shí)也可以此為基礎(chǔ)設(shè)計(jì)專用芯片,批量流片。因此本方法適用于FPGA實(shí)現(xiàn)也具有很好的現(xiàn)實(shí)應(yīng)用價(jià)值。

如圖2所示,為本發(fā)明基于FPGA的圖像旋轉(zhuǎn)裝置一實(shí)施例的結(jié)構(gòu)示意圖,該基于FPGA的圖像旋轉(zhuǎn)裝置包括:

分塊處理單元100,用于將存儲(chǔ)在外部存儲(chǔ)器DDR中的原圖像進(jìn)行分塊處理,獲取M*N塊原子圖像塊,M為大于1的正整數(shù),N為大于1的正整數(shù)。

具體地,在分塊處理單元100中,分塊處理單元100對(duì)采集到的原圖像進(jìn)行分塊可根據(jù)原圖像每個(gè)像素點(diǎn)進(jìn)行劃分,也可以按塊對(duì)原圖像進(jìn)行劃分,且每一塊的大小可根據(jù)存儲(chǔ)器的大小進(jìn)行劃分。在本發(fā)明的實(shí)施例中,存儲(chǔ)器可以為由FPGA內(nèi)部的多個(gè)BRAM組成的存儲(chǔ)器,則按照存儲(chǔ)器的大小進(jìn)行劃分,即為根據(jù)多個(gè)BRAM組成的容量對(duì)原圖像進(jìn)行分塊。例如,以xilinx 7系列FPGA為例,F(xiàn)PGA內(nèi)部的1塊BRAM的容量為36Kb,如果每個(gè)像素的位寬為32bit,則1塊BRAM可以存儲(chǔ)36*1024bit/32bit=1152個(gè)像素,原圖像為5百萬像素的圖像有2592*1944=5038848個(gè)像素。

如果采用4塊BRAM作為一個(gè)存儲(chǔ)器,則該存儲(chǔ)器可以存儲(chǔ)的最大子圖像塊的像素?cái)?shù)為1152*4=4608個(gè),則5百萬像素原圖像最少需要分成5038848/4608=1074塊。在實(shí)際進(jìn)行原圖像分塊時(shí),需根據(jù)FPGA內(nèi)部的BRAM的數(shù)量確定一個(gè)存儲(chǔ)器的大小,進(jìn)而對(duì)原圖像進(jìn)行分塊。例如,可以將5百萬像素原圖像分成水平32塊*垂直37塊,則每個(gè)子圖塊的大小為水平m=81像素*n=53像素,則4塊BRAM組成的一個(gè)存儲(chǔ)器可以存儲(chǔ)83*55(比m,n各大2,即存儲(chǔ)器比原子圖像塊多2列、2行)。

如果采用8塊BRAM作為一個(gè)存儲(chǔ)器,則存儲(chǔ)器可以存儲(chǔ)的最大子圖像塊的像素?cái)?shù)為1152*8=9216個(gè),則5百萬像素原圖像最少需要分成5038848/9216=547塊。在實(shí)際進(jìn)行原圖像分塊時(shí),需根據(jù)FPGA內(nèi)部的BRAM的數(shù)量確定一個(gè)存儲(chǔ)器的大小,進(jìn)而對(duì)原圖像進(jìn)行分塊。例如,可以將5百萬像素原圖像分成水平28塊*垂直24塊,每個(gè)子圖塊的大小為水平m=95像素*n=81像素,則4塊BRAM組成的存儲(chǔ)器可以存儲(chǔ)97*83(比m,n各大2,即存儲(chǔ)器比原子圖像塊多2列、2行),這樣原子圖像塊的總數(shù)比前面所述的4塊BRAM作為一個(gè)存儲(chǔ)器時(shí)的原子圖像塊的總數(shù)要少,但BRAM的需求數(shù)量從4個(gè)提高到了8個(gè)。

第一存儲(chǔ)單元200,用于將一塊所述原子圖像塊存儲(chǔ)在輸入緩存塊中,所述輸入緩存塊包括多個(gè)存儲(chǔ)器。

具體地,在分塊處理單元100中,對(duì)于5百萬像素的原圖像分成水平32塊*垂直37塊,輸入緩存塊中包括多個(gè)BRAM組成的存儲(chǔ)器,則每次只存儲(chǔ)一塊原子圖像塊m=83像素*n=55像素在多個(gè)BRAM組成的存儲(chǔ)器中。

旋轉(zhuǎn)單元300,用于根據(jù)旋轉(zhuǎn)角度對(duì)一塊所述原子圖像塊進(jìn)行旋轉(zhuǎn)得到一塊旋轉(zhuǎn)子圖像塊,并將一塊所述旋轉(zhuǎn)子圖像塊存儲(chǔ)在輸出緩存塊中,所述輸出緩存塊包括多個(gè)存儲(chǔ)器。

第二存儲(chǔ)單元400,用于將存儲(chǔ)在所述輸出緩存塊中的執(zhí)行了旋轉(zhuǎn)操作后的一塊所述旋轉(zhuǎn)子圖像塊存儲(chǔ)在輸出緩存器中。

重復(fù)執(zhí)行單元500,用于重復(fù)執(zhí)行所述第一存儲(chǔ)單元、所述旋轉(zhuǎn)存儲(chǔ)單元以及所述第二存儲(chǔ)單元的執(zhí)行步驟,直至M*N塊所述旋轉(zhuǎn)子圖像塊全部存儲(chǔ)在輸出緩存器中,得到最終的旋轉(zhuǎn)圖像。

具體地,在本發(fā)明的實(shí)施例中,本發(fā)明的圖像旋轉(zhuǎn)裝置是基于FPGA的圖像旋轉(zhuǎn)裝置,其對(duì)圖像的分塊、旋轉(zhuǎn)及輸出均可在FPGA上實(shí)現(xiàn)。且在本發(fā)明的實(shí)施例中,對(duì)原子圖像塊的旋轉(zhuǎn)處理可采取并行的模式,也就是說,當(dāng)FPGA中有較多BRAM時(shí),可根據(jù)實(shí)際應(yīng)用,由BRAM組成多個(gè)存儲(chǔ)器并行進(jìn)行旋轉(zhuǎn)處理。

進(jìn)一步地,分塊處理單元100根據(jù)輸入緩存塊中的存儲(chǔ)器的大小確定原子圖像塊的大小對(duì)原圖像進(jìn)行分塊處理。具體地,在本發(fā)明的實(shí)施例中,輸入緩存塊包括多個(gè)存儲(chǔ)器,存儲(chǔ)器可以為由FPGA內(nèi)部的多個(gè)BRAM組成,其大小由所使用的FPGA所能分配給用于圖像旋轉(zhuǎn)存儲(chǔ)子圖像塊的BRAM的數(shù)量決定,本發(fā)明對(duì)對(duì)存儲(chǔ)器的大小此不作具體的限定,可根據(jù)實(shí)際處理進(jìn)行確定。在本發(fā)明的實(shí)施例中,BRAM可為36Kb等。可以理解地,例如,以xilinx 7系列FPGA為例,F(xiàn)PGA內(nèi)部的1塊BRAM的容量為36Kb,如果每個(gè)像素的位寬為32bit,則1塊BRAM可以存儲(chǔ)36*1024bit/32bit=1152個(gè)像素,原圖像為5百萬像素的圖像有2592*1944=5038848個(gè)像素。

如果采用4塊BRAM作為一個(gè)存儲(chǔ)器,則該存儲(chǔ)器可以存儲(chǔ)的最大子圖像塊的像素?cái)?shù)為1152*4=4608個(gè),則5百萬像素原圖像最少需要分成5038848/4608=1074塊。在實(shí)際進(jìn)行原圖像分塊時(shí),需根據(jù)FPGA內(nèi)部的BRAM的數(shù)量確定一個(gè)存儲(chǔ)器的大小,進(jìn)而對(duì)原圖像進(jìn)行分塊。例如,可以將5百萬像素原圖像分成水平32塊*垂直37塊,則每個(gè)子圖塊的大小為水平m=81像素*n=53像素,則4塊BRAM組成的一個(gè)存儲(chǔ)器可以存儲(chǔ)83*55(比m,n各大2,即存儲(chǔ)器比原子圖像塊多2列、2行)。

在一些實(shí)施例中,在第一存儲(chǔ)單元200中,采用突發(fā)模式將存儲(chǔ)在外部存儲(chǔ)器DDR中的原子圖像塊讀入到輸入緩存塊中,且在每次讀取原子圖像塊時(shí),比原子圖像塊多讀取2行2列。例如,前述實(shí)施例中,假設(shè)M0為分塊后的第一塊原子圖像塊,則讀取該原子圖像塊時(shí)比該原子圖像塊的大小多讀取2行2列。在本發(fā)明的實(shí)施例中,采取讀取原子圖像塊的數(shù)據(jù)時(shí)多讀取2行2列的數(shù)據(jù)讀取方式實(shí)際是對(duì)原子圖像塊進(jìn)行邊緣處理,從而可使其大旋轉(zhuǎn)后得到正常的旋轉(zhuǎn)輸出,實(shí)現(xiàn)了無缺失旋轉(zhuǎn)的目的。另外,在本發(fā)明的實(shí)施例中,讀取原子圖像塊時(shí)采用的是突發(fā)(burst)的模式。突發(fā)是指在同一行中相鄰的存儲(chǔ)單元連續(xù)進(jìn)行數(shù)據(jù)傳輸?shù)姆绞?,連續(xù)傳輸?shù)闹芷诰褪峭话l(fā)長(zhǎng)度,即burst length。采集突發(fā)模式,在進(jìn)行突發(fā)傳輸時(shí)只要指定起始列地址與突發(fā)長(zhǎng)度,內(nèi)存就會(huì)依次地自動(dòng)對(duì)后面相應(yīng)數(shù)量的存儲(chǔ)單元進(jìn)行讀/寫操作,而不再需要控制器連續(xù)提供列地址。因此,在本發(fā)明的實(shí)施例中采用突發(fā)模式讀取原子圖像塊實(shí)現(xiàn)了順序的DDR讀取地址,即從左到右,從上到下,從而使得讀取到輸入緩存塊中的原子圖像塊是從第一塊原子圖像塊開始依次按順序讀取的,避免了隨機(jī)讀取的問題,從而大大提高了處理速度,減少占用資源小。

在一些實(shí)施例中,旋轉(zhuǎn)單元300根據(jù)旋轉(zhuǎn)角度以原子圖像塊的中心點(diǎn)為旋轉(zhuǎn)中心進(jìn)行旋轉(zhuǎn),并將旋轉(zhuǎn)后的旋轉(zhuǎn)子圖像存儲(chǔ)在輸出緩存塊中。在本發(fā)明的實(shí)施例中,假設(shè)旋轉(zhuǎn)角度為a,以原子圖像塊的中心為中心進(jìn)行角度為a的矩陣旋轉(zhuǎn)運(yùn)算,得到旋轉(zhuǎn)a角度后的旋轉(zhuǎn)子圖像塊,并將旋轉(zhuǎn)a角度后的旋轉(zhuǎn)子圖像塊存儲(chǔ)在輸出緩存塊中。進(jìn)一步地,在旋轉(zhuǎn)單元300執(zhí)行的同時(shí),即在第二存儲(chǔ)單元400開始執(zhí)行前,由于本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)裝置采用的是以將原圖像分塊后對(duì)每一塊原子圖像塊進(jìn)行單獨(dú)旋轉(zhuǎn)的,所以在最后輸出的圖像中會(huì)帶有非圖像內(nèi)容,即相當(dāng)于無效的數(shù)據(jù),而為了避免在輸出緩存器中寫入無效數(shù)據(jù),占用內(nèi)存,本發(fā)明則采用增加無效使能的標(biāo)志,以使無效數(shù)據(jù)不被寫入緩存器中??梢岳斫獾兀唧w為,根據(jù)旋轉(zhuǎn)子圖像塊的旋轉(zhuǎn)坐標(biāo)通過反向旋轉(zhuǎn)得到旋轉(zhuǎn)子圖像塊對(duì)應(yīng)原子圖像塊在輸入緩存塊中的反向旋轉(zhuǎn)坐標(biāo),如果反向旋轉(zhuǎn)坐標(biāo)超出了原子圖像塊的坐標(biāo)范圍(也就是說,如果反向旋轉(zhuǎn)坐標(biāo)在原子圖像塊的坐標(biāo)內(nèi)沒有對(duì)應(yīng)的坐標(biāo)),則對(duì)該旋轉(zhuǎn)子圖像塊的旋轉(zhuǎn)坐標(biāo)對(duì)應(yīng)的點(diǎn)增加數(shù)據(jù)有效標(biāo)志,該數(shù)據(jù)有效標(biāo)志為0。在具體的實(shí)施例中,如果在輸入緩存塊沒有對(duì)應(yīng)坐標(biāo)的圖像數(shù)據(jù),則該旋轉(zhuǎn)坐標(biāo)對(duì)應(yīng)的數(shù)據(jù)為無效數(shù)據(jù),并置該點(diǎn)為0,假設(shè)為strobe(數(shù)據(jù)有效標(biāo)志),則在寫入輸出緩存器時(shí)strobe為0,即不寫入輸出緩存器中,也就是說,在輸入緩存塊中除了存儲(chǔ)原圖像像素值外,還需存儲(chǔ)對(duì)應(yīng)的像素的數(shù)據(jù)有效數(shù)據(jù)有效標(biāo)志strobe信號(hào)。

在一些實(shí)施例中,旋轉(zhuǎn)單元300中還包括根據(jù)原子圖像塊的中心點(diǎn)在原圖像中的坐標(biāo)及旋轉(zhuǎn)角度,計(jì)算得到旋轉(zhuǎn)后的旋轉(zhuǎn)子圖像塊的中心點(diǎn)在旋轉(zhuǎn)后的圖像中的坐標(biāo);根據(jù)旋轉(zhuǎn)子圖像塊在旋轉(zhuǎn)后的圖像中的坐標(biāo)及旋轉(zhuǎn)子圖像塊的大小確定存儲(chǔ)在所述輸出緩存塊中的旋轉(zhuǎn)子圖像塊寫入到輸出緩存器中的起始地址。具體地,將原子圖像塊的中心點(diǎn)在原圖像中的坐標(biāo),以原圖像的中心旋轉(zhuǎn)a角度,得到旋轉(zhuǎn)后的旋轉(zhuǎn)子圖像塊中心點(diǎn)在輸出緩存器中的坐標(biāo),并以此坐標(biāo)推測(cè)出旋轉(zhuǎn)子圖像塊在輸出緩存器中的起始位置,即起始地址。

在一些實(shí)施例中,第二存儲(chǔ)單元400包括:第二存儲(chǔ)單元400根據(jù)起始地址將存儲(chǔ)在輸出緩存塊中的旋轉(zhuǎn)子圖像塊寫入到輸出緩存器中,直至一個(gè)旋轉(zhuǎn)子圖像塊完全寫入輸出緩存器中。

在一些實(shí)施例中,第二存儲(chǔ)單元400包括:第二存儲(chǔ)單元400采用突發(fā)的模式根據(jù)起始地址將旋轉(zhuǎn)子圖像塊寫入到輸出緩存器中。

在一些實(shí)施例中,本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)裝置中,分塊處理單元100所劃分的每一塊原子圖像塊為正方形,且連長(zhǎng)為奇數(shù)。

進(jìn)一步地,本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)裝置為基于FPGA的圖像旋轉(zhuǎn)裝置,其中所指的輸入緩存塊中的存儲(chǔ)器和輸出緩存塊中的存儲(chǔ)器為由FPGA內(nèi)部的多個(gè)BRAM組成的存儲(chǔ)器,輸出緩存器為FPGA的擴(kuò)展存儲(chǔ)器,即外部存儲(chǔ)器DDR。

由前述的背景技術(shù)分析可知,制約快速旋轉(zhuǎn)實(shí)現(xiàn)的最大的瓶頸在于處理過程中對(duì)原圖像數(shù)據(jù)的隨機(jī)讀取上:由于旋轉(zhuǎn)的特點(diǎn),造成需要的數(shù)據(jù)分布相對(duì)來說是隨機(jī)的(即不是順序的DDR地址,從左到右,從上到下),這種情況下,按前面分析,要么就是采用足夠大隨機(jī)緩存,要么就不采用burst讀,在隨機(jī)緩存不夠的情況下,就會(huì)造成速度瓶頸。因此,本發(fā)明的重點(diǎn)就是要避開隨機(jī)讀取的問題,要使讀與寫都采用burst順序操作,這樣才能提高速度,同時(shí)也要滿足不能使用太多的隨機(jī)緩存。

現(xiàn)在對(duì)本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法進(jìn)行舉例說明,如圖3所示,先將原圖I2進(jìn)行分塊獲得原子圖像塊,由圖3示意,根據(jù)FPGA內(nèi)部BRAM的容量,對(duì)原圖I2進(jìn)行分塊,在本實(shí)施例中,在BRAM足夠的條件下,原子圖像塊越大越好,同時(shí)將分塊后的原子圖像塊依次按照burst方式將原子圖像塊讀取到第一儲(chǔ)存器(FPGA內(nèi)部的BRAM)中。另外,原子圖像塊為正方形且原子圖像塊的邊長(zhǎng)為奇數(shù),旋轉(zhuǎn)子圖像塊的邊長(zhǎng)是原子圖像塊的邊長(zhǎng)的倍,即旋轉(zhuǎn)角度最大的情況(45度)的奇數(shù)倍時(shí)可以存放下旋轉(zhuǎn)輸出的圖像塊,如圖4所示。

具體地,

(1)將原圖像進(jìn)行分塊,獲得原子圖像塊,并以單個(gè)原子圖像塊為單元(實(shí)際多2行2列)以DDR burst方式讀入到輸入緩存塊的存儲(chǔ)器中;

(2)以存儲(chǔ)在輸入緩存塊中的原子圖像塊的中心為中心進(jìn)行角度為a的矩陣旋轉(zhuǎn)運(yùn)算,得到的旋轉(zhuǎn)a角度后的旋轉(zhuǎn)子圖像塊存入輸出緩存塊中,無效數(shù)據(jù)置數(shù)據(jù)有效數(shù)據(jù)有效標(biāo)志為0。在該步驟中,寫入輸出緩存塊中的數(shù)據(jù)時(shí),如果在輸入緩存塊中沒有對(duì)應(yīng)的原子圖像數(shù)據(jù),即無效數(shù)據(jù),則置該點(diǎn)的strobe為0,寫入DDR時(shí)其strobe就是0,即不寫入;也就是在輸入緩存塊中除了要存儲(chǔ)圖像像素值,還需要存儲(chǔ)對(duì)應(yīng)的像素的數(shù)據(jù)有效數(shù)據(jù)有效標(biāo)志strobe信號(hào)。

(3)將原子圖像塊的中心點(diǎn)在原圖像中的坐標(biāo),以原圖像的中心作a角度旋轉(zhuǎn),得到旋轉(zhuǎn)后的旋轉(zhuǎn)子圖像塊的中心點(diǎn)在輸出緩存塊中的坐標(biāo),并以此坐標(biāo)推算出在輸出緩存塊中的旋轉(zhuǎn)子圖像塊的圖像在輸出緩存器中的起始位置,即起始地址,然后將輸出緩存塊中的數(shù)據(jù)以burst方式結(jié)合數(shù)據(jù)有效數(shù)據(jù)有效標(biāo)志寫入到對(duì)應(yīng)位置的輸出緩存器DDR中,從而完成了原圖像中一個(gè)塊的旋轉(zhuǎn),重復(fù)以上步驟,直到原圖像中所劃分的每一子圖像塊都處理完,即完成了一幅圖像的旋轉(zhuǎn)。在該步驟中,寫入DDR時(shí),要配合輸出緩存塊中像素點(diǎn)的strobe信息,只寫入有效數(shù)據(jù),無效數(shù)據(jù)不寫入DDR,如圖5所示。

如圖6所示,確定旋轉(zhuǎn)后旋轉(zhuǎn)子圖像塊的大??;

原子圖像塊的長(zhǎng)寬分別為width、height,逆時(shí)針旋轉(zhuǎn)角度a后,旋轉(zhuǎn)后圖像的完整大小為W*H,則

W=width*cos(a)+height*sin(a)

H=height*cos(a)+width*sin(a) (1)

在本發(fā)明的實(shí)施例中,對(duì)圖像塊的旋轉(zhuǎn)可按一般的圖像旋轉(zhuǎn)進(jìn)行旋轉(zhuǎn),本發(fā)明對(duì)此不作限定。

以圖像中心為原點(diǎn),逆時(shí)鐘旋轉(zhuǎn)角度a,旋轉(zhuǎn)前坐標(biāo)為(x,y,1)T,旋轉(zhuǎn)后坐標(biāo)為(x1,y1,1)T,旋轉(zhuǎn)矩陣為M,及逆矩陣為M-1,有

(x1,y1,1)T=M*(x,y,1)T (2)

則有

反向旋轉(zhuǎn),逆矩陣

(x1,y1,1)T=M-1*(x,y,1)T (4)

如圖7所示。原圖有a的旋轉(zhuǎn)角,則穩(wěn)像需要反向旋轉(zhuǎn)角度a,因此,圖像塊處理時(shí)只要按公式(4)、(5)操作就可以。

由于對(duì)原子圖像塊的旋轉(zhuǎn)是以原子圖像塊的中心為中心進(jìn)行的,所以可以通過旋轉(zhuǎn)后的旋轉(zhuǎn)子圖像塊中心來推測(cè)旋轉(zhuǎn)子圖像塊緩存在DDR中新圖像的存儲(chǔ)坐標(biāo)。如圖7右邊所示,輸出緩存塊中旋轉(zhuǎn)子圖像塊的存儲(chǔ)起始坐標(biāo)(xs,ys)即圖中最左上角的坐標(biāo),其與旋轉(zhuǎn)后的旋轉(zhuǎn)子圖像塊的中心(xc,yc)之間的關(guān)系由圖可知

而w與h可由旋轉(zhuǎn)前的原子圖像塊的width及height根據(jù)式(1)求出。由此可確定旋轉(zhuǎn)子圖像塊存儲(chǔ)到DDR中的起始坐標(biāo)。

由于如果按變換前后圖像塊尺寸一樣來從原子圖像塊計(jì)算旋轉(zhuǎn)子圖像塊,根據(jù)旋轉(zhuǎn)角度在旋轉(zhuǎn)時(shí)旋轉(zhuǎn)子圖像塊邊界在新圖中是傾斜的,而計(jì)算時(shí)由于是非整數(shù)計(jì)算,所以會(huì)造成旋轉(zhuǎn)后的子圖像塊中圖塊之間的邊界出現(xiàn)鋸齒狀。原因就是圖塊旋轉(zhuǎn)時(shí)邊界數(shù)據(jù)不夠,為此,可以將原子圖像塊(即實(shí)際處理的圖像塊)取的數(shù)據(jù)多于原圖像實(shí)際劃分的子圖像塊,這樣,每次相鄰兩處理圖像塊就會(huì)有部分重疊,實(shí)驗(yàn)表明,只要原圖處理塊比原圖塊大2行2列即可。

如圖8所示,原圖像分成了3行4列的原子圖像塊(即一個(gè)原子圖像塊的大小為mxn),取數(shù)據(jù)時(shí)在原子圖像塊中取窗口((m+2)x(n+2)),如圖8所示,w0為在原圖中第一個(gè)原子圖像塊的取數(shù)據(jù)示意,w1為處理塊在第二個(gè)原子圖像塊的取數(shù)據(jù)示意,可以看到每2個(gè)相鄰塊之間都會(huì)有部分?jǐn)?shù)據(jù)(2行或2列)重合,這樣便可保證在最終輸出緩存器DDR中得到正常的旋轉(zhuǎn)圖像。

如圖9所示,為本發(fā)明基于FPGA的圖像旋轉(zhuǎn)方法的基于FPGA實(shí)現(xiàn)原理框圖,本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法是基于FPGA實(shí)現(xiàn)的,其采用以最少的資源實(shí)現(xiàn)任意角度圖像(包括視頻)旋轉(zhuǎn)的效果的同時(shí),可以根據(jù)FPGA的資源情況,通過簡(jiǎn)單模塊利用,達(dá)到更高效快速并行處理,提高速度,節(jié)省資源、降低成本。從整體來看,本發(fā)明的基于FPGA的圖像旋轉(zhuǎn)方法電路的具體實(shí)施結(jié)構(gòu)包括2個(gè)大的模塊,分別為主控單元和圖塊處理單元。

具體地,主控單元以原始圖像劃分的原子圖像塊為計(jì)數(shù),將需要處理的原子圖像塊的起始坐標(biāo)、原子圖像塊的大小、原子圖像塊的中心點(diǎn)在原圖像中的坐標(biāo)、旋轉(zhuǎn)角度等參數(shù)發(fā)送給圖塊處理單元,由圖塊處理單元完成對(duì)原子圖像塊的讀取、旋轉(zhuǎn)及輸出存儲(chǔ)到外部存儲(chǔ)器DDR(即輸出緩存器)中,從而完成一塊原子圖像塊的旋轉(zhuǎn),并返回完成信號(hào)給主控單元,主控單元的原子圖像塊計(jì)數(shù)將加一計(jì)數(shù),直到所有原子圖像塊都完成了旋轉(zhuǎn),即完成一幅圖像的旋轉(zhuǎn)。在FPGA中的電路實(shí)現(xiàn)時(shí),可以根據(jù)FPGA邏輯資源的情況,一個(gè)主控單元可同時(shí)控制多個(gè)圖塊處理單元,從而達(dá)到并行處理的效果,提升整體圖像旋轉(zhuǎn)的處理速度。

圖塊處理單元在主控單元的控制下,通過對(duì)原子圖像塊的數(shù)據(jù)讀取、旋轉(zhuǎn)、輸出到外部存儲(chǔ)器DDR的操作,完成此原子圖像塊的旋轉(zhuǎn),并返回完成狀態(tài)信號(hào)給主控單元。圖塊處理單元可以有多個(gè),所有的圖塊處理單元相同,每個(gè)圖塊處理單元內(nèi)部主要包括7個(gè)子模塊:分別為子控制模塊、原子圖像塊讀取模塊、輸入緩存塊、坐標(biāo)處理模塊、數(shù)據(jù)搬移模塊、輸出緩存塊、輸出模塊。

子控制模塊:子控制模塊主要用于接收主控單元發(fā)送的參數(shù),如原子圖像塊在DDR中的起始坐標(biāo)、原子圖像塊的大小、原子圖像塊的中心點(diǎn)在原圖像中的坐標(biāo)、旋轉(zhuǎn)角度等參數(shù),并在主控制單元發(fā)出控制信號(hào)后,將需要處理的原子圖像塊的起始坐標(biāo)、原子圖像塊的大小等參數(shù),發(fā)送給原子圖像塊讀取模塊,由原子圖像塊讀取模塊完成從外部存儲(chǔ)器DDR中以burst模式讀出原子圖像塊并存儲(chǔ)在輸入緩存塊中,在收到原子圖像塊讀取模塊返回的完成信號(hào)后,子控制模塊將原子圖像塊大小、旋轉(zhuǎn)角度、原子圖像塊中心點(diǎn)在原圖像中的坐標(biāo)等參數(shù)發(fā)送給坐標(biāo)處理模塊,并啟動(dòng)坐標(biāo)處理模塊,坐標(biāo)處理模塊將輸入緩存塊中的原子圖像塊旋轉(zhuǎn)、存儲(chǔ)在輸出緩存塊并最終通過輸出模塊存儲(chǔ)到外部存儲(chǔ)器DDR后,坐標(biāo)處理模塊返回原子圖像塊處理完成信號(hào)給子控制模塊,子控制模塊最終將完成信號(hào)返回給主控單元,代表主控單元要求處理的原子圖像塊已經(jīng)處理完成,即完成對(duì)一塊原子圖像塊的旋轉(zhuǎn)。

原子圖像塊讀取模塊:原子圖像塊用于讀取原子圖像塊并返回完成信號(hào),即讀取模塊接收子控制模塊發(fā)送過來的需要處理的原子圖像塊的起始坐標(biāo)、原子圖像塊大小等參數(shù),以burst模式讀取外部存儲(chǔ)器DDR的命令,將需要處理的原子圖像塊從外部存儲(chǔ)器DDR中讀出,并存儲(chǔ)在輸入緩存塊中,并返回完成信號(hào)給子控制模塊。

輸入緩存塊:輸入緩存塊主要用于緩存原子圖像塊,其由FPGA內(nèi)部BRAM組成的緩存塊,用來緩存待處理的原圖像的子圖像塊,即原子圖像塊。其特點(diǎn)是容量小、隨機(jī)存取、速度快。

坐標(biāo)處理模塊:坐標(biāo)處理模塊主要用于處理原子圖像塊的坐標(biāo)。具體地,坐標(biāo)處理模塊接收子控制模塊發(fā)送的原子圖像塊大小、原子圖像塊中心點(diǎn)在原圖像中的坐標(biāo)、旋轉(zhuǎn)角度等參數(shù),在接收到子控制模塊發(fā)出的啟動(dòng)命令后,將輸出緩存塊的坐標(biāo),通過反向旋轉(zhuǎn),得到其對(duì)應(yīng)原圖像的點(diǎn)在輸入緩存塊中的坐標(biāo),然后將此輸入及輸出的坐標(biāo)發(fā)送給數(shù)據(jù)搬移模塊,由數(shù)據(jù)搬移模塊完成將輸入緩存塊的圖像數(shù)據(jù)搬移到輸出緩存塊中,依次完成整個(gè)輸入緩存塊中的原子圖像塊的旋轉(zhuǎn)。同時(shí),坐標(biāo)處理模塊,反向旋轉(zhuǎn)得到的坐標(biāo),如果超出了輸入緩存塊的坐標(biāo)范圍,則在輸出緩存塊中置該點(diǎn)的位為0,代表此點(diǎn)的數(shù)據(jù)無效,不需要寫入到外部存儲(chǔ)器DDR的起始坐標(biāo),并輸出給輸出模塊,由輸出模塊完成將輸出緩存塊的數(shù)據(jù)寫入到外部存儲(chǔ)器DDR中。

數(shù)據(jù)搬移模塊:數(shù)據(jù)搬移模塊主要用于搬移數(shù)據(jù),即根據(jù)坐標(biāo)處理模塊發(fā)送過來的坐標(biāo),從輸入緩存塊中讀取數(shù)據(jù),并存儲(chǔ)到輸出緩存塊中,從而完成數(shù)據(jù)的搬移。

輸出緩存塊:輸出緩存塊主要用于緩存旋轉(zhuǎn)后的旋轉(zhuǎn)子圖像塊,其與輸入緩存塊一樣,也是由FPGA內(nèi)部BRAM組成的緩存塊,用來緩存旋轉(zhuǎn)后的子圖像塊,即旋轉(zhuǎn)子圖像塊。其特點(diǎn)是容量小、隨機(jī)存取、速度快。

輸出模塊:輸出模塊主要用于將輸出緩存塊的數(shù)據(jù)寫入到外部存儲(chǔ)器DDR中。具體地,輸出模塊接收坐標(biāo)處理模塊發(fā)出的輸出緩存塊寫入到外部存儲(chǔ)器DDR的起始地址,并啟動(dòng),以burst的模式,將輸出緩存塊的數(shù)據(jù)全部寫入到對(duì)應(yīng)地址的外部存儲(chǔ)器DDR中。從輸出緩存塊中取數(shù)據(jù)時(shí),跳過標(biāo)志位為0的無效數(shù)據(jù),從而達(dá)到只寫入有效數(shù)據(jù)的目的、減少無效操作,直至將所有的旋轉(zhuǎn)子圖像塊寫入外部存儲(chǔ)器DDR中,最終得到旋轉(zhuǎn)后的圖像。

以上實(shí)施例只為說明本發(fā)明的技術(shù)構(gòu)思及特點(diǎn),其目的在于讓熟悉此項(xiàng)技術(shù)的人士能夠了解本發(fā)明的內(nèi)容并據(jù)此實(shí)施,并不能限制本發(fā)明的保護(hù)范圍。凡跟本發(fā)明權(quán)利要求范圍所做的均等變化與修飾,均應(yīng)屬于本發(fā)明權(quán)利要求的涵蓋范圍。

應(yīng)當(dāng)理解的是,對(duì)本領(lǐng)域普通技術(shù)人員來說,可以根據(jù)上述說明加以改進(jìn)或變換,而所有這些改進(jìn)和變換都應(yīng)屬于本發(fā)明所附權(quán)利要求的保護(hù)范圍。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1