1. 程式人生 > >基於FPGA的影象處理(三)--影象融合

基於FPGA的影象處理(三)--影象融合

          System Generator安裝之後可以在Simulink中呼叫相應的模組進行視覺演算法的搭建,我兩臺電腦上分別是ISE12.3+matlab2010a, ISE10.1+Matlab2010a。需要注意的是ISE和Matlab之間是有型號匹配的。

          首先要開啟FPGA,開啟Simulink,新建一個Model。

          在Xilinx Blockset中拖取需要的模組,搭建影象處理的演算法。本程式是一個影象融合演算法,讀入兩幅影象,相加,擷取低8位,輸出。

      

         其中System generator模組是每一個model中都必須的,在System Generator可以進行一些配置,包括編譯選項、FPGA的選型、綜合工具、HDL語言、時鐘週期等,如果只是在上位機模擬不下載到FPGA中,那麼這些引數基本都不用改。

        這裡我使用的Xilinx公司的官方開發板ML605,晶片是Virtex6 xc6vc240t-1ff1156,HDL語言選擇了Verilog。

                                                                                 

        gateway In和gateway out模組是FPGA和外部的紐帶,FPGA只支援定點數,是不支援float、double型別的,通過gateway In可以將資料轉化為需要的型別,gateway out又將處理之後的資料傳出,可以在Matlab中檢視。

        為模型添加回調函式callback。在model properties中新增。PreLoadFcn中新增LoadImage_gray,StopFcn中新增ShowImage_gray,這兩個函式實際是在當前資料夾下的m檔案,這樣在進行模擬時兩個函式會分別在載入和停止時自動執行。二者的功能分別是提供初始資料和資料的後處理顯示。

                                                                

//LoadImage_gray的程式碼,將兩張原始影象讀入,並轉化為一個n行2列的矩陣傳入gateway In

%讀取原始影象資料
SourceImage1_2D = imread('rice.png');
SourceImage2_2D = imread('text.png');
SourceImage2_2D = 250*SourceImage2_2D;
%得到影象的長寬尺寸
ImageWidth = size(SourceImage1_2D,2);
ImageHeight = size(SourceImage1_2D,1);
%將二維陣列轉換成一維陣列
SourceImage1_1D = reshape(SourceImage1_2D',1,ImageWidth*ImageHeight);
SourceImage1_1D = [SourceImage1_1D];
SourceImage2_1D = reshape(SourceImage2_2D',1,ImageWidth*ImageHeight);
SourceImage2_1D = [SourceImage2_1D];
%按照格式形成Simulink的To Workspace模組要求的資料格式
SourceImage1_1D = [ double(0:ImageWidth*ImageHeight-1)'  double(SourceImage1_1D)'];
SourceImage2_1D = [ double(0:ImageWidth*ImageHeight-1)'  double(SourceImage2_1D)'];
%設定整個模組的輸入到輸出延時
DesignLatency = 2;

//ShowImage_gray的程式碼 ,主要是將處理結果的以為資料轉化為二維影象資料,並顯示
%將DestImage1D一維陣列轉換成規定大小的DestImage2D二維陣列
DestImage2D = reshape(DestImage1D(DesignLatency:DesignLatency+ImageHeight*ImageWidth-1),ImageWidth,ImageHeight);       
DestImage2D = DestImage2D';
%按照格式顯示輸入影象和輸出影象
h = figure;
clf;
colormap(gray(256));
        
set(h,'Name','Results');

image(DestImage2D),  axis off;

         這些準備完成之後還要修改一些模擬時間,這裡是影象的點數加上延時,ImageWidth*ImageHeight+DesignLatency。

         DesignLatency是一個需要自己根據演算法中延時的長度自己調整的引數,並在Loadimage_gray中修改。需要特別注意的是System Genrator的時序問題是一個很麻煩的問題,經常會因為時序導致模擬結果一差千里,千萬注意。

        下面可以進行模擬了。

        //原圖1   rice

           

      //原圖2 text

           

         //計算結果

         

二、生成HDL程式碼

         System Generator的真正高階之處在於能夠將簡單搭建的模組轉化為HDL程式碼,我們進行簡單的配置,生成Verilog HDL程式碼。

         

         選中Create testbench,硬體語言選擇Verilog HDL,點Generate ,自動生成ISE工程。

         完成之後在netlist資料夾下生成了一個ISE的工程,直接用ISE開啟工程就可以看到Verilog程式碼,包括testBench,由於我的板子是官方開發板,因此其中的管腳約束檔案都是自動生成的,十分方面,如果使用的自己做的板子的話,可能需要修改一些管腳約束檔案ucf檔案。在ISE下進行模擬,效果如下:

          

         可以看到 geteway out的資料都是兩個gateway In資料的和,剛還延遲一個時鐘週期。

        目前正在使用System Generator搭搭建立體視覺演算法,雖然已經搭建完成,但是時序問題沒有處理明白,導致進行匹配時,總是發生錯位,導致匹配效果大大降低,如果哪位高手解決了此問題的話,還望不吝賜教。