本發(fā)明屬于fpga嵌入式圖像處理技術(shù)領(lǐng)域,涉及一種空間標(biāo)志物動(dòng)態(tài)坐標(biāo)實(shí)時(shí)捕捉相機(jī)?;趂pga并行圖像處理,可以在幀率為100幀并且1280×720的高分辨率下,最多可以實(shí)時(shí)計(jì)算出圖像中200多個(gè)動(dòng)態(tài)標(biāo)志物的空間坐標(biāo)。
背景技術(shù):
運(yùn)動(dòng)捕捉系統(tǒng)在動(dòng)漫制作、運(yùn)動(dòng)員訓(xùn)練、互動(dòng)式游戲等領(lǐng)域應(yīng)用非常廣泛。在動(dòng)漫制作時(shí),可以通過捕捉真人的動(dòng)作,然后進(jìn)行三維動(dòng)畫合成,可以極大的提高動(dòng)畫制作的效率,降低了成本,提高了動(dòng)漫制作的水平。通過捕捉運(yùn)動(dòng)員的動(dòng)作,便于進(jìn)行量化,結(jié)合人體生理學(xué)、物理學(xué)原理,研究改進(jìn)的方法,使體育訓(xùn)練擺脫純粹依靠經(jīng)驗(yàn)的狀態(tài),進(jìn)入理論化、數(shù)字化的時(shí)代。還可以把成績差的運(yùn)動(dòng)員的動(dòng)作捕捉下來,將其與優(yōu)秀運(yùn)動(dòng)員動(dòng)作進(jìn)行對(duì)比分析,從而幫助其訓(xùn)練。在互動(dòng)式游戲開發(fā)領(lǐng)域,可以利用運(yùn)動(dòng)捕捉技術(shù)捕捉游戲者的各種動(dòng)作,用以驅(qū)動(dòng)游戲環(huán)境中角色的動(dòng)作,給游戲者以一種全新的參與感受,加強(qiáng)游戲的真實(shí)感和互動(dòng)性。此外,運(yùn)動(dòng)捕捉系統(tǒng)在醫(yī)療,機(jī)器人,無人機(jī)等領(lǐng)域應(yīng)用也非常廣泛
當(dāng)圖像大小為1280×720時(shí),傳統(tǒng)的圖像處理算法按照中值濾波、邊緣檢測(cè)和重心計(jì)算處理完一幅圖像時(shí)間都在50ms以上,實(shí)時(shí)性較差,算法復(fù)雜度高。針對(duì)上述背景內(nèi)容,提供一種空間標(biāo)志物動(dòng)態(tài)坐標(biāo)實(shí)時(shí)捕捉相機(jī)具有重要使用價(jià)值。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是提供一種空間標(biāo)志物動(dòng)態(tài)坐標(biāo)實(shí)時(shí)捕捉相機(jī),該空間標(biāo)志物動(dòng)態(tài)坐標(biāo)實(shí)時(shí)捕捉相機(jī)基于fpga高速并行處理的特點(diǎn),圖像的采集和數(shù)據(jù)處理都在fpga單芯片中進(jìn)行。在高幀率高分辨率的條件下,實(shí)時(shí)性好,結(jié)構(gòu)簡單。
本發(fā)明采用的技術(shù)方案如下:
一種空間標(biāo)志物動(dòng)態(tài)坐標(biāo)實(shí)時(shí)捕捉相機(jī)設(shè)計(jì),步驟如下:
1.cmos圖像傳感器電路連接
fpga通過iic總線的sclk時(shí)鐘和sdata數(shù)據(jù)信號(hào)向?qū)mos圖傳感器的寄存器中寫入設(shè)置的參數(shù)。包括工作模式、圖像和增益的大小等設(shè)置。fpga還向傳感器提供12.5mhz的主輸入時(shí)鐘extclk,然后通過傳感器的片上鎖相環(huán)倍頻成96mhz的像素時(shí)鐘pixclk。fpga還要為其提供曝光觸發(fā)信號(hào)trigger,用來控制圖像幀率,當(dāng)trigger為低電平時(shí),就會(huì)觸發(fā)一幀圖像,低電平時(shí)間的長短決定曝光時(shí)間的長短。圖像傳感器把輸出的圖像數(shù)據(jù)dout、輸出像素時(shí)鐘pixclk、幀有效信號(hào)fv和行有效信號(hào)lv等信號(hào)傳輸?shù)絝pga上。通過兩排插針將fpga與cmos圖像傳感器連接起來。
2.microblaze嵌入式軟核與fpga的數(shù)據(jù)交換
ddr3作為microblaze的內(nèi)存,緩存從雙口塊ram1中讀取的數(shù)據(jù)段。ddr3通過多端口內(nèi)存控制器mpmc連接到microblaze內(nèi)核。microblaze軟核通過塊ram控制器來讀寫雙口塊ram。microblaze通過雙口塊ram1的控制器從塊ram1讀取邊緣坐標(biāo)數(shù)據(jù);microblaze通過雙口塊ram2的控制器向雙口塊ram2寫入動(dòng)態(tài)標(biāo)志物的質(zhì)心坐標(biāo)數(shù)據(jù)。在本發(fā)明中,兩個(gè)雙口塊ram都是用一個(gè)端口用來讀,另一個(gè)端口用來寫。塊ram1的端口a是寫入邊緣坐標(biāo)數(shù)據(jù)數(shù)據(jù)的端口,與fpga圖像處理模塊相連。端口b是讀出邊緣坐標(biāo)數(shù)據(jù)數(shù)據(jù)的端口,與塊ram1控制器的輸入信號(hào)端口相連;塊ram2端口a是寫入動(dòng)態(tài)標(biāo)志物的質(zhì)心坐標(biāo)數(shù)據(jù)的端口,與塊ram2控制器的輸出信號(hào)端口相連。端口b是讀出質(zhì)心坐標(biāo)數(shù)據(jù)的端口,也與切換模塊相連。
在microblaze中通過讀數(shù)據(jù)函數(shù)xio_in32讀取出雙口塊ram1中的所有邊緣坐標(biāo)數(shù)據(jù)存儲(chǔ)到ddr3中。microblaze軟核通過連通域快速檢測(cè)算法,只需遍歷一次ddr3中的邊緣坐標(biāo)數(shù)據(jù)段矩陣,就可以實(shí)時(shí)計(jì)算出整幀圖像中的所有動(dòng)態(tài)標(biāo)志物的質(zhì)心坐標(biāo),算法過程如下:
(1)對(duì)數(shù)據(jù)進(jìn)行初始化,total表示一共有多少個(gè)數(shù)據(jù)段。i表示計(jì)數(shù)數(shù)據(jù)段的個(gè)數(shù),初始化為1,即從第一個(gè)數(shù)據(jù)段開始判斷。n表示當(dāng)前一共有多少個(gè)動(dòng)態(tài)標(biāo)志物連通域,初始化為1。j表示當(dāng)前判斷的是第幾個(gè)動(dòng)態(tài)標(biāo)志物的連通域。初始為1。row_num[j]表示第j個(gè)動(dòng)態(tài)標(biāo)志物占有多少行,初始化為1。mark_num表示一共計(jì)算了多少個(gè)動(dòng)態(tài)標(biāo)志物的質(zhì)心坐標(biāo)。初始化為0。
(2)判斷當(dāng)前數(shù)據(jù)段個(gè)數(shù)i是否小于等于total。若不滿足條件,依次計(jì)算出當(dāng)前n個(gè)動(dòng)態(tài)標(biāo)志物質(zhì)心坐標(biāo),再把mark_num與n和的值賦給mark_num,結(jié)束一幀圖像所有動(dòng)態(tài)標(biāo)志物的坐標(biāo)計(jì)算。若滿足條件,則對(duì)j賦初值1,即對(duì)當(dāng)前已有的n個(gè)連通域逐一進(jìn)行判斷。
(3)判斷j是否小于等于n,不滿足,說明第i個(gè)數(shù)據(jù)段不在當(dāng)前的n個(gè)動(dòng)態(tài)標(biāo)志物連通域內(nèi),而在一個(gè)新的連通域內(nèi),增加當(dāng)前連通域個(gè)數(shù),將n的值加1。計(jì)算第n個(gè)新連通域在x和y方向上的像素,再把i的值加1,對(duì)下一個(gè)數(shù)據(jù)段進(jìn)行循環(huán)判斷。直到i的值大于total,計(jì)算出整幀動(dòng)態(tài)標(biāo)志物質(zhì)心坐標(biāo)。
(4)若j小于等于n,則判斷第i個(gè)數(shù)據(jù)段是否在第j個(gè)動(dòng)態(tài)標(biāo)志物的連通域內(nèi),若滿足,把第j個(gè)連通域在x和y方向上的像素分別累加。再把row_num[j]加1,變量i加1,對(duì)下一個(gè)數(shù)據(jù)段進(jìn)行循環(huán)判斷,直到i大于total。
(5)當(dāng)?shù)趇個(gè)數(shù)據(jù)段不屬于第j個(gè)動(dòng)態(tài)標(biāo)志物的連通域時(shí),判斷是否隔行。
1)隔行,即當(dāng)前數(shù)據(jù)段的縱坐標(biāo)數(shù)據(jù)與第j個(gè)連通域的最后一行縱坐標(biāo)數(shù)據(jù)的差值大于2,則后面的數(shù)據(jù)段都不在第j個(gè)連通域內(nèi),因此計(jì)算出第j個(gè)連通域的質(zhì)心坐標(biāo),mark_num個(gè)數(shù)累加1。刪除第j個(gè)連通域,用后一個(gè)(第j+1)連通域的數(shù)據(jù)覆蓋掉前一個(gè)(第j個(gè))連通域的數(shù)據(jù),直到用最后一個(gè)(第n個(gè))連通域覆蓋掉第n-1個(gè)連通域的數(shù)據(jù)。連通域個(gè)數(shù)n減1。計(jì)算j減1后,再用j加1,即判斷當(dāng)前第i個(gè)數(shù)據(jù)段是否在當(dāng)前第j個(gè)動(dòng)態(tài)標(biāo)志物的連通域內(nèi)。
2)不隔行,直接判斷當(dāng)前第i個(gè)數(shù)據(jù)段是否在下一個(gè)動(dòng)態(tài)標(biāo)志物的連通域,計(jì)算j=j(luò)+1,對(duì)下一個(gè)連通域進(jìn)行判斷。繼續(xù)循環(huán)判斷,直到i大于total。
根據(jù)連通域快速檢測(cè)算法,計(jì)算出整幀圖像中的所有動(dòng)態(tài)標(biāo)志物的質(zhì)心坐標(biāo),并把計(jì)算出的質(zhì)心坐標(biāo)數(shù)據(jù)存儲(chǔ)到ddr3中,再通過寫數(shù)據(jù)函數(shù)xio_out8將計(jì)算出的質(zhì)心坐標(biāo)數(shù)據(jù)寫入到雙口塊ram2中,計(jì)算結(jié)果經(jīng)過切換模塊后,輸入到fpga的fifoip核中緩存,fifo另一端連接的是千兆網(wǎng)端口。
fpga切換模塊輸入端是濾波后的圖像數(shù)據(jù)和動(dòng)態(tài)標(biāo)志物的質(zhì)心坐標(biāo)數(shù)據(jù)。當(dāng)接收到顯示圖像的命令時(shí),切換模塊把圖像數(shù)據(jù)通過千兆網(wǎng)發(fā)送到上位機(jī)上進(jìn)行圖像的實(shí)時(shí)顯示;在接收到顯示坐標(biāo)命令時(shí),切換模塊把動(dòng)態(tài)標(biāo)志物的質(zhì)心坐標(biāo)數(shù)據(jù)通過千兆網(wǎng)傳輸?shù)缴衔粰C(jī)實(shí)時(shí)顯示動(dòng)態(tài)坐標(biāo)的軌跡。
本發(fā)明的有益結(jié)果:
(1)采用iic總線對(duì)cmos圖像傳感器進(jìn)行配置。
(2)本發(fā)明基于fpga的快速并行處理的特點(diǎn),在fpga中實(shí)現(xiàn)對(duì)圖像數(shù)據(jù)采集和處理以及計(jì)算動(dòng)態(tài)標(biāo)志物質(zhì)心坐標(biāo)的功能,不但簡化結(jié)構(gòu),而且實(shí)時(shí)性好、處理速度快。而傳統(tǒng)運(yùn)動(dòng)捕捉系統(tǒng)只能在對(duì)圖像數(shù)據(jù)采集存儲(chǔ)后,再交由后端進(jìn)行處理,對(duì)圖像數(shù)據(jù)實(shí)時(shí)處理能力差。
(3)本發(fā)明的快速連通域檢測(cè)算法,算法復(fù)雜度非常低,為o(n)。對(duì)所有的數(shù)據(jù)只遍歷一次就實(shí)現(xiàn)對(duì)整幀圖像中所有的動(dòng)態(tài)標(biāo)志物質(zhì)心坐標(biāo)的計(jì)算,從而保證了系統(tǒng)的實(shí)時(shí)性。傳統(tǒng)算法復(fù)雜度高,為o(n2),計(jì)算量大、耗時(shí)多。
(4)本發(fā)明算法實(shí)現(xiàn)了對(duì)幀率100為幀分辨率為1280×720的圖像實(shí)時(shí)顯示功能和最多實(shí)時(shí)計(jì)算并顯示200多個(gè)動(dòng)態(tài)標(biāo)志物坐標(biāo)的功能。實(shí)現(xiàn)對(duì)高幀高分辨率多個(gè)動(dòng)態(tài)標(biāo)志物質(zhì)心坐標(biāo)的實(shí)時(shí)捕捉,實(shí)用性好。
附圖說明
圖1為本發(fā)明的整體流程示意圖。
圖2為cmos圖像傳感器的電路連接圖。
圖3為microblaze與fpga數(shù)據(jù)交換連接圖。
圖4為提取動(dòng)態(tài)標(biāo)志物邊緣坐標(biāo)數(shù)據(jù)流程圖。
圖5為本發(fā)明連通域快速檢測(cè)算法流程圖。
圖6為本發(fā)明傳感器實(shí)時(shí)顯示圖像。
圖7為本發(fā)明二值化后的圖像。
圖8為本發(fā)明實(shí)時(shí)計(jì)算200多個(gè)動(dòng)態(tài)標(biāo)志物的質(zhì)心坐標(biāo)圖像。
具體實(shí)施方式
以下結(jié)合本發(fā)明的技術(shù)方案與附圖對(duì)本發(fā)明包含的步驟分別進(jìn)行詳細(xì)完整的描述。
步驟一,cmos圖像傳感器電路連接
xilinx公司的fpga通過iic總線的sclk時(shí)鐘和sdata數(shù)據(jù)信號(hào)向?qū)mos圖傳感器的寄存器中寫入設(shè)置的參數(shù)。包括工作模式、圖像和增益的大小等設(shè)置。fpga還向傳感器提供12.5mhz的主輸入時(shí)鐘extclk,然后通過傳感器的片上鎖相環(huán)倍頻成96mhz的像素時(shí)鐘pixclk。fpga還要為其提供曝光觸發(fā)信號(hào)trigger,用來控制圖像幀率,每當(dāng)trigger為低電平時(shí),就會(huì)觸發(fā)一幀圖像,低電平時(shí)間的長短決定曝光時(shí)間的長短。圖像傳感器把輸出的圖像數(shù)據(jù)dout、輸出像素時(shí)鐘pixclk、幀有效信號(hào)fv和行有效信號(hào)lv等信號(hào)傳輸?shù)絝pga上。通過兩排插針將fpga與cmos圖像傳感器連接起來。如附圖2所示。
步驟二,fpga圖像處理模塊對(duì)數(shù)據(jù)進(jìn)行并行處理
xilinx公司的fpga輸入圖像接口接收來自傳感器的輸出信號(hào)。fpga的圖像處理模塊一邊對(duì)圖像數(shù)據(jù)進(jìn)行均值濾波,把濾波后的數(shù)據(jù)輸出到切換模塊,一邊并行處理提取出動(dòng)態(tài)標(biāo)志物的邊緣坐標(biāo)數(shù)據(jù),如附圖4所示,過程如下:
(1)首先對(duì)圖像中的像素灰度值進(jìn)行二值化處理。將每幀圖像中的所有像素的灰度值都分別與閾值進(jìn)行比較。比閾值大,置為1,否則為0。定義一個(gè)4位wire型變量mark_state,用來表示四個(gè)連續(xù)像素的二值化后的結(jié)果。
(2)當(dāng)mark_state的值為4'b0001,當(dāng)前的圖像列坐標(biāo)為左邊緣坐標(biāo)x1。當(dāng)mark_state的值為4'b1110時(shí),當(dāng)前圖像的列坐標(biāo)為右邊緣坐標(biāo)x2,當(dāng)前的行坐標(biāo)為縱坐標(biāo)y。把這三個(gè)數(shù)據(jù)寫成數(shù)據(jù)段(x1,x2,y)的形式。
(3)檢測(cè)到右邊緣時(shí)把雙口塊ram1的寫使能信號(hào)bram_wen置為1,開始向塊ram1輸入數(shù)據(jù)信號(hào)bram_data中依次寫入x1、x2和y。然后把bram_wen置0。重復(fù)檢測(cè)右邊緣,直到把整幀圖像中所有動(dòng)態(tài)標(biāo)志物的邊緣坐標(biāo)數(shù)據(jù)全部檢測(cè)出來。并且把所有的數(shù)據(jù)段數(shù)據(jù)存入塊雙口塊ram1中。
步驟四,microblaze嵌入式軟核與fpga的數(shù)據(jù)交換
ddr3作為microblaze的內(nèi)存,緩存從雙口塊ram1中讀取的數(shù)據(jù)段。ddr3通過多端口內(nèi)存控制器mpmc連接到microblaze內(nèi)核。microblaze軟核通過塊ram控制器來讀寫雙口塊ram。microblaze通過雙口塊ram1的控制器從塊ram1讀取邊緣坐標(biāo)數(shù)據(jù);microblaze通過雙口塊ram2的控制器向雙口塊ram2寫入動(dòng)態(tài)標(biāo)志物的質(zhì)心坐標(biāo)數(shù)據(jù)。在本發(fā)明中,兩個(gè)雙口塊ram都是用一個(gè)端口用來讀,另一個(gè)端口用來寫。如附圖3所示,塊ram1的端口b是寫入邊緣坐標(biāo)數(shù)據(jù)數(shù)據(jù)的端口,與fpga圖像處理模塊相連。端口a是讀出邊緣坐標(biāo)數(shù)據(jù)數(shù)據(jù)的端口,與塊ram1控制器的輸入信號(hào)端口相連;塊ram2端口a是寫入動(dòng)態(tài)標(biāo)志物的質(zhì)心坐標(biāo)數(shù)據(jù)的端口,與塊ram2控制器的輸出信號(hào)端口相連。端口b是讀出質(zhì)心坐標(biāo)數(shù)據(jù)的端口,也與切換模塊相連。
在microblaze中通過讀數(shù)據(jù)函數(shù)xio_in32讀取出雙口塊ram1中的所有邊緣坐標(biāo)數(shù)據(jù)存儲(chǔ)到ddr3中。microblaze軟核中連通域快速檢測(cè)算法的流程圖,如附圖5所示,只需要遍歷一次ddr3中的邊緣坐標(biāo)數(shù)據(jù)段,實(shí)時(shí)計(jì)算出每幀圖像中所有動(dòng)態(tài)標(biāo)志物的質(zhì)心坐標(biāo),把計(jì)算出的質(zhì)心坐標(biāo)數(shù)據(jù)存儲(chǔ)到ddr3中,再通過寫數(shù)據(jù)函數(shù)xio_out8將坐標(biāo)計(jì)算結(jié)果寫入到雙口塊ram2中,計(jì)算結(jié)果經(jīng)過fpga的圖像或坐標(biāo)顯示切換模塊,輸入到fpga的fifoip核中緩存,fifo另一端連接的是千兆網(wǎng)端口。
當(dāng)接收到上位機(jī)實(shí)時(shí)顯示圖像的命令時(shí),fpga的圖像或坐標(biāo)顯示切換模塊把圖像數(shù)據(jù)通過千兆網(wǎng)發(fā)送到上位機(jī)上進(jìn)行圖像的實(shí)時(shí)顯示,如附圖6所示為顯示的圖像,附圖7所示為顯示的二值化后的圖像;在接收到顯示坐標(biāo)命令時(shí),fpga的圖像或坐標(biāo)顯示切換模塊把動(dòng)態(tài)標(biāo)志物的質(zhì)心坐標(biāo)數(shù)據(jù)通過千兆網(wǎng)傳輸?shù)缴衔粰C(jī)實(shí)時(shí)顯示動(dòng)態(tài)質(zhì)心的坐標(biāo),如附圖8所示。