基於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搭搭建立體視覺演算法,雖然已經搭建完成,但是時序問題沒有處理明白,導致進行匹配時,總是發生錯位,導致匹配效果大大降低,如果哪位高手解決了此問題的話,還望不吝賜教。