新聞中心

        EEPW首頁 > 消費電子 > 設計應用 > 雙目立體視覺攝像頭模塊開發(fā)搭建,含源代碼、電路圖

        雙目立體視覺攝像頭模塊開發(fā)搭建,含源代碼、電路圖

        作者: 時間:2017-06-08 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201706/351008.htm

        作品摘要

        本作品為基于ATLYS 開發(fā)平臺、VmodCAM模塊開發(fā)設計的雙目系統(tǒng)。VmodCAM用于采集雙路的視覺信息,開發(fā)平臺負責完成視覺信息的處理及圖像的高速分析。采集到得左右兩路圖像信息通過分析處理,便可得到二維圖像上的深度信息。深度信息的體現本作品中設計了兩種方式,其一為視覺信息的立體顯示,經過處理生成疊加的紅藍3D圖像,給人直觀上的立體感受。該設計方面可以應用于的采集與顯示,定位為的采集與顯示系統(tǒng)。另一方面,通過在片上設計的高速圖像處理系統(tǒng),可以根據左右圖像的差距,計算出圖像的深度信息,也就是物體在環(huán)境中相對于的三維坐標。該設計方面可以應用到人機交互、機器視覺領域,作為機器對環(huán)境情況的認知設備。

        FPGA開發(fā)板在本作品中的作用主要有:①配置攝像頭模塊,采集攝像頭數據;②將圖像數據緩存在片外的DDR2中;③完成圖像的分析處理;④完成圖像的顯示及

        設計目標

        一方面,完成立體視覺實時采集與顯示系統(tǒng)的設計,讓人戴上3D眼鏡后可以實時看到立體畫面;另一方面,實現物體三維空間定位。

        已實現:基于紅藍3D眼鏡的立體視覺實時采集與顯示;紅外光點的三維空間定位。

        將實現:基于偏振3D眼鏡的立體視覺實時采集與顯示;簡單環(huán)境下的物體空間定位及環(huán)境三維重建,并開發(fā)成用于人機交互的設備。

        設計總概

        本設計為在FPGA片上完成的視頻、圖像采集與處理系統(tǒng),完成三維圖像的重建與數學建模。片上系統(tǒng)使用VHDL+Verilog聯(lián)合開發(fā),具有很高的數據處理速度。該設計的兩個方面目前已初步實現,圖像的采集、處理過程均由片上系統(tǒng)完成,為該設計的進一步優(yōu)化打下了很好的基礎。

        開發(fā)工具

        硬件方面:

        • Diglient ATLYS FPGA 開發(fā)板
        • Diglient VmodCAM 模塊
        • LCD 顯示器
        • 計算機

        軟件方面:

        • XILINX ISE
        • Digilent Adept
        • Processing

        背景

        根據有關科學統(tǒng)計,人們通過視覺獲得的信息量約占獲得信息總量的70%。視覺信息中具有著很多有價值的信息量,但是由于視覺信息數據量大,處理過程復雜等因素,過去很長一段時間中,視覺信息處理僅處于理論研究階段。

        過去20年間,隨著IT產業(yè)的飛速前進,軟硬件方面均發(fā)生的翻天覆地的變化,這讓許多復雜的視覺信息的處理的過程變得越來越可實現化。

        近幾年以來,視頻圖像處理方向上的工程應用越來越多,并已走入大多數人的生活。比如:指紋識別、Kinect體感器等等。

        然而,目前的圖像處理過程的實現大多是基于軟件平臺的,如Intel開發(fā)的圖像處理庫OpenCV等。對于低速、簡單的圖像處理,軟件尚能勝任,但高速、雜的圖像處理過程用軟件處理起來很難達到實時性。鑒于這方面的原因,我們決定采用FPGA的并行處理、流水線處理能力實現視覺信息的高速處理。

        通過FPGA做視覺信息處理的過程,不斷探索硬件圖像處理算法。同時,圖像具有的很多方面特征用并行處理方式去完成將具有顯著優(yōu)勢,這也將是未來圖像處理的一個重要發(fā)展方向。

        設計介紹

        第一部分:立體視頻采集與顯示

        • 系統(tǒng)組成:

         1.總體框圖:

        本系統(tǒng)由從硬件上看由三大部分構成,分別是用于圖像采集的攝像頭模塊、實現圖像處理的FPGA開發(fā)板、進行結果顯示的LCD顯示器。

        2.硬件組成部分:

        (1)攝像頭模塊:采用Digilent公司出品的VmodCAM攝像頭模塊。該模塊上搭載有兩個Micron公司的MT9D112 CMOS圖像傳感器(本系統(tǒng)中用到一個)。該傳感器最高支持1600x900分辨率,采用IIC的配置協(xié)議,并且內置PLL鎖相環(huán),能夠產生嚴格精準相位的控制時鐘,達到高速高精度的目的。

        • 數據處理系統(tǒng):本硬件平臺的數據圖像處理,智能識別系統(tǒng)由FPGA開發(fā)板實現。本項目中使用的為Digilent公司的ATLYS FPGA 開發(fā)板。其上集成的FPGA 芯片為Xilinx 公司生產的Spartan-6 LX45。該開發(fā)板上集成有多個視頻輸入輸出接口(HDMI),適合做視頻處理。

        • 顯示模塊:我們采用液晶顯示器作為系統(tǒng)的顯示界面,達到可視化強,便于實時的交互的效果。

        1. 片內系統(tǒng)部分:

        (1)系統(tǒng)架構

        (1)系統(tǒng)架構

        (2)攝像頭模塊

        Input:

        D_I(7:0):8-bit數據輸入(data input),來自片外的攝像頭模塊,傳輸像素的值,通常兩個時鐘的數據(16bit)組成一個像素值;

        CLK:時鐘信號,來自時鐘模塊Inst_SysCon的CAMCLK_O輸出;

        CLK_180:時鐘信號,來自時鐘模塊Inst_SysCon的CAMCLK_180_O輸出(應該為CLK信號的180度相差信號,用來與CLK協(xié)調完成D_I(7:0)到D_O(15:0)的轉化,起到像素前后部分的標志位作用);

        FV_I:幀有效信號(Frame Valid),也稱場同步信號,來自攝像頭模塊,輸出一幀圖像期間,電平為高,幀與幀之間時,電平拉低;(參見MT9D112_DS Page28 Figure18)

        LV_I:行有效信號(Line Valid),也稱行同步信號,來自攝像頭模塊,輸出圖像的一行期間,電平為高,行與行之間時,電平拉低;(參見MT9D112_DS Page28 Figure18)

        PCLK_I:信號來自CAM_PCLK_I經過I/O緩沖器(IOBUF)后的輸出,邏輯上等價于CAM_PCLK_I;

        RST_I:模塊復位信號,來自SysCon模塊的ASYNC_RST端口。

        Output:

        D_O(15:0):16-bit數據輸出信號(RGB565),由兩個8-bit的輸入數據組裝得到,代表一個像素的顏色值等,輸出給FBCtl圖像緩存控制模塊的DIA(15:0);

        DV_O:輸出給FBCtl圖像緩存控制模塊的ENA,作為使能信號,每當一個像素的16位數值配齊時置1;

        MCLK_O:輸出給攝像頭,作為其外部時鐘信號XCLK的輸入(6—54MHz);

        PCLK_O:輸出給FBCtl圖像緩存控制模塊的CLKA,來自于PCLK_I的緩沖,作為圖像存儲時的像素同步時鐘;

        PWDN_O:恒定為0,直接輸出給攝像頭的,起到power_up功能;

        RST_O:輸出給攝像頭,用作攝像頭復位(低有效);

        VDDEN_O:與Inst_camctlB的相同端口求與后輸出到攝像頭的VDDEN管腳,應該是連到攝像頭,作為工作接通通電源的使能信號;

        SCL:輸出到攝像頭的SCLK端口(FPGA→Camera),作為串行接口的時鐘輸入;

        SDA:輸出到攝像頭的SDATA端口(FPGA↔Camera),作為串行接口的信號傳輸。

        (3)圖像緩存控制模塊

        Input:

        ENC:來自VideoTimingCtl模塊的VDE_O端口,讀寫控制();

        RSTC_I:來自SysCon模塊的ASYNC_RST端口;

        CLKC:來自SysCon模塊的PCLK_O端口;

        //////////////////////////////////////////////////////////////////////////////

        ENB:來自CamCtlB模塊的DV_O端口,讀寫控制(1寫);

        RSTB_I:來自Inst_InputSync_FVB模塊的D_O端口取反與SysCon模塊的ASYNC_RST端口求或;

        CLKB:來自CamCtlB模塊的PCLK_O端口;

        /////////////////////////////////////////////////////////////////////////////

        ENA:來自CamCtlA模塊的DV_O端口,讀寫控制(1寫);

        RSTA_I:來自Inst_InputSync_FVA模塊的D_O端口取反與SysCon模塊的ASYNC_RST端口求或;

        CLKA:來自CamCtlA模塊的PCLK_O端口;

        /////////////////////////////////////////////////////////////////////////////

        ddr2clk_2x:來自SysCon模塊的DDR2CLK_2X_O端口;

        ddr2clk_2x_180:來自SysCon模塊的DDR2CLK_2X_180_O端口;

        pll_ce_0:來自SysCon模塊的PLL_CE_0_O端口;

        pll_ce_90:來自SysCon模塊的PLL_CE_90_O端口;

        pll_lock:來自SysCon模塊的PLL_LOCK端口;

        async_rst:來自SysCon模塊的ASYNC_RST端口;

        mcb_drp_clk:來自SysCon模塊的MCB_DRP_CLK_O端口;

        RD_MODE(1:0):來自SysCon模塊的MSEL_O(1:0)端口;

        DIB(15:0):來自Inst_camctlB模塊的D_O(15:0)端口;

        DIA(15:0):來自Inst_camctlA模塊的D_O(15:0)端口;

        Output:

        RDY_O:該信號取反后與SysCon模塊的ASYNC_RST信號求或后輸給VideoTimingCtl模塊的RST_I端口;

        mcb3_dram_ras_n:輸出給DDR2;

        mcb3_dram_cas_n:輸出給DDR2;

        mcb3_dram_we_n:輸出給DDR2;

        mcb3_dram_odt:輸出給DDR2;

        mcb3_dram_cke:輸出給DDR2;

        mcb3_dram_dm:輸出給DDR2;

        mcb3_dram_udm:輸出給DDR2;

        mcb3_dram_ck:輸出給DDR2;

        mcb3_dram_ck_n:輸出給DDR2;

        DOC(15:0):輸出給DVITransmitter模塊的BLUE_I/GREEN_I/RED_I,以RGB565的方式自高位向低位排列;

        mcb3_dram_a(12:0):輸出給DDR2;

        mcb3_dram_ba(2:0):輸出給DDR2;

        mcb3_dram_udqs:雙向端口,連接到DDR2;

        mcb3_dram_udqs_n:雙向端口,連接到DDR2;

        mcb3_rzq:雙向端口,連接到DDR2;

        mcb3_zio:雙向端口,連接到DDR2;

        mcb3_dram_dqs:雙向端口,連接到DDR2;

        mcb3_dram_dqs_n:雙向端口,連接到DDR2;

        mcb3_dram_dq(15:0):雙向端口,連接到DDR2;

        • 圖像處理實現:

        第二部分:三維空間定位

        • 硬件組成:
        1. 攝像頭模塊:在攝像頭前加裝了兩個850nm的紅外濾光片,用來濾出紅外光點。

        1. 紅外光點:

        1. LCD顯示器:用于光點識別的顯示。

        1. 光點檢測片上模塊

        模塊源代碼:

        module center(

        input pclk, // pixel clock

        input din, // 1-bit pixel value, come from BW image buffer

        input [11:0] Hcnt, // 0-1599 來自VideoTimmingCtl的HCNT_O

        input [10:0] Vcnt, // 0-899 來自VideoTimmingCtl的 VCNT_O

        output reg[11:0] center_h, // 0-1599,中點橫向坐標

        output reg [10:0] center_v // 0-899,中點縱向坐標

        );

        reg [20:0] num; //亮點區(qū)像素總數

        wire [19:0] h_num; //亮點區(qū)像素總數的一半

        reg [20:0] num_cnt; //亮點區(qū)像素總數計數

        reg [11:0] h_cnt; //中點橫向坐標計數

        reg [10:0] v_cnt; //中點縱向坐標計數

        reg [20:0] center_line_sum; //中間一行的有效像素橫坐標和

        reg [20:0] center_line_sum_cnt; //中間一行的有效像素橫坐標和計數

        reg [10:0] center_line_num; //中間一行的有效像素總數

        reg [10:0] center_line_num_cnt; //中間一行的有效像素總數計數

        assign h_num= num[20:1];

        //有效區(qū)間

        reg en;

        always@(*) begin

        if(Hcnt>0 Hcnt1599 Vcnt>0 Vcnt899)

        en= 1;

        else

        en= 0;

        end

        //亮點區(qū)像素總數計數

        always@(posedge pclk) begin

        if(Hcnt==1 Vcnt==0) //掃描到像素點(1,0)處時

        begin

        num_cnt= 0;

        end

        else

        if(din==1 en==1) num_cnt= num_cnt+1;

        else num_cnt= num_cnt;

        end

        //中點縱坐標計數

        always@(posedge pclk) begin

        if(num_cnth_num) v_cnt= Vcnt;

        else v_cnt= v_cnt;

        end

        //中間一行有效像素橫坐標和

        always@(posedge pclk) begin

        if(Hcnt==1 Vcnt==0) //掃描到像素點(1,0)處時

        begin

        center_line_sum_cnt= 0;

        end

        else

        if(Vcnt==center_v en==1 din==1)

        center_line_sum_cnt= center_line_sum_cnt + Hcnt;

        else

        center_line_sum_cnt= center_line_sum_cnt;

        end

        //中間一行的有效像素總數

        always@(posedge pclk) begin

        if(Hcnt==1 Vcnt==0) //掃描到像素點(1,0)處時

        begin

        center_line_num_cnt= 0;

        end

        else

        if(Vcnt==center_v en==1 din==1)

        center_line_num_cnt= center_line_num_cnt + 1;

        else

        center_line_num_cnt= center_line_num_cnt;

        end

        //除法器

        wire rfd;

        wire [10:0] fractional;

        wire [20:0] quotient;

        div Divider (

        .rfd(rfd),

        .clk(pclk),

        .dividend(center_line_sum),

        .quotient(quotient),

        .divisor(center_line_num),

        .fractional(fractional)

        );

        //一幀結尾賦值

        always@(posedge pclk) begin

        if(Hcnt==1598 Vcnt==899)//掃描到像素點(1598,899)處時

        begin

        num= num_cnt;

        center_v= v_cnt;

        center_h= quotient[11:0];

        center_line_sum= center_line_sum_cnt;

        center_line_num= center_line_num_cnt;

        end

        end

        endmodule

        • 軟件部分:

        PC上在Processing環(huán)境中開發(fā)了一個3D動畫界面,通過立方體模擬紅外光點的三維位置。該程序接收從開發(fā)板經由UART協(xié)議發(fā)來的光點坐標,并將結果顯示在窗口中。



        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 长白| 濉溪县| 东丰县| 云梦县| 通许县| 衡水市| 南丹县| 舒兰市| 静宁县| 乐安县| 玉龙| 张北县| 平顶山市| 华池县| 古交市| 南汇区| 得荣县| 城口县| 炉霍县| 当阳市| 新化县| 长宁县| 罗源县| 白山市| 阿图什市| 新源县| 清新县| 江西省| 陵水| 内江市| 大田县| 岐山县| 明水县| 延长县| 博兴县| 合川市| 东乡族自治县| 赫章县| 霍州市| 温州市| 隆回县|