學會System Generator(22)影像採集與輸出(資料流方法)

FPGADesigner發表於2018-07-14

本文是該系列的第22篇。上一篇介紹了使用Image From File和Video Viewer完成影像的採集和輸出,並將兩部分分別打包為子系統,使其具有通用性。本文將介紹如何使用Simulink提供的回撥函式機制,實現從MATLAB工作空間採集和輸出影像。


Simulink回撥函式機制

在空白處右鍵->Model Properties,切換到“Callbacks”標籤下,可以看到Simulink支援的回撥函式,這些函式在某些時刻會自動觸發,執行M檔案中的程式:
這裡寫圖片描述
點選每個函式,可以在右邊看到該函式的觸發時刻;右邊的編輯框中輸入執行的M檔案的名稱。M檔案與slx檔案在同一目錄下。


System Generator設計

資料流方法完成影像的採集與輸出,其實就是從MATLAB的工作空間中匯入影像資料,再將結果匯出到工作空間。按下圖連線model:
這裡寫圖片描述
From Workspace從工作空間中讀取資料;To Workspace將資料匯出到工作空間。讀出資料時會受到取樣時間的控制,因此讀出的為標量資料,可以直接接入Gateway In中。三個輸入模組和輸出模組分別對應R、G、B三個通道,雙擊開啟配置介面,在“Data”中設定變數名稱。

設計思路如下:在啟動模型時,設計一個函式讀取圖片並將圖片轉換為From Worspace相容的格式;在模擬結束時,設計一個函式將輸出的資料重新整理為圖片格式並顯示結果。新增一個PreLoadFcn回撥函式LoadImg.m、一個StopFcn回撥函式ShowImg.m,分別完成上述功能。


回撥函式設計

LoadImg.m檔案的程式碼清單如下:

%讀取圖片
img = imread('test.jpg');

%讀取圖片尺寸
width = size(img, 2);    %長
height = size(img, 1);   %寬

%讀取RGB通道,2維轉1維
inimg_r = reshape(img(:,:,1), 1, width*height);
inimg_g = reshape(img(:,:,2), 1, width*height);
inimg_b = reshape(img(:,:,3), 1, width*height);

%From Workspace讀取的變數要求為double型別矩陣
%第一列為時間;其餘列為資料
inimg_r = [(0:width*height-1)'  double(inimg_r)'];
inimg_g = [(0:width*height-1)'  double(inimg_g)'];
inimg_b = [(0:width*height-1)'  double(inimg_b)'];

注意From Workspace讀取的變數(inimg_r、inimg_g、inimg_b)中的第一列為取樣時間設定,這裡設計為每個時刻讀一個畫素值。StopFcn.m檔案的程式碼清單如下:

%一維轉二維
out_r = reshape(outimg_r(1:width*height), height, width);
out_g = reshape(outimg_g(1:width*height), height, width);
out_b = reshape(outimg_b(1:width*height), height, width);

%組合RGB通道
showimg = zeros(width, height, 3); 
showimg(:,:,1) = out_r;
showimg(:,:,2) = out_g;
showimg(:,:,3) = out_b;

subplot(121);
imshow(img);  title('輸入影像');
subplot(122);
imshow(uint8(showimg));  title('輸出影像');

將RGB三通道合為一副影像並顯示。


模擬測試

讀取一副256*256的RGB影像,系統取樣時間為1s,模擬時長設定為256*256,即只讀取一次完整的影像。先關閉slx檔案,再次啟動,此時MATLAB的工作空間:
這裡寫圖片描述
可見啟動時執行了LoadImg函式。執行模擬後,MATLAB的工作空間:
這裡寫圖片描述
可見模擬結束時執行了ShowImg函式,彈出結果圖如下:
這裡寫圖片描述
在某些方面講,基於資料流方法的影像採集與輸出要更靈活,設計者可以根據需要隨意設計回撥函式(當然回撥函式的用途不限於此)。

相關文章