本文將介紹如何使用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); %寬
%讀取R、G、B通道,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);
%組合R、G、B通道
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函數,彈出結果圖如下:
在某些方面講,基于數據流方法的圖像采集與輸出要更靈活,設計者可以根據需要隨意設計回調函數(當然回調函數的用途不限于此)。
編輯:hfy
-
matlab
+關注
關注
185文章
2980瀏覽量
230826 -
Simulink
+關注
關注
22文章
536瀏覽量
62565
發布評論請先 登錄
相關推薦
評論