學會System Generator(22)影像採集與輸出(資料流方法)
本文是該系列的第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); %寬
%讀取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函式,彈出結果圖如下:
在某些方面講,基於資料流方法的影像採集與輸出要更靈活,設計者可以根據需要隨意設計回撥函式(當然回撥函式的用途不限於此)。
相關文章
- 資料流輸出
- AWR資料採集方法
- [java IO流]之 鍵盤顯示器輸入輸出流(System)Java
- 資料採集的方法有哪些
- [java IO流]之 基本資料型別輸入輸出流Java資料型別
- flume日誌採集,hbase資料儲存,hive查詢輸出(簡單整合)Hive
- 資料儲存與輸出輸入
- 直播app開發公司技術之推流端影像採集篇APP
- 重學java中的輸入輸出流Java
- 資料採集與融合術作業三
- 社會化海量資料採集爬蟲框架搭建爬蟲框架
- Python資料的輸入與輸出Python
- 輸入輸出流
- eKuiper 1.5.0 釋出: 實現無縫式工業資料採集+邊緣流處理UI
- 玩轉大資料系列之一:資料採集與同步大資料
- Python資料科學(五) 資料處理和資料採集Python資料科學
- Labview軟體、NI資料採集卡、汽車發動機資料採集學習總結(二)View
- ASM資料和File System檔案轉移方法集錦ASM
- UAV心跳機制與容器、程式資料採集
- 資料採集與融合技術作業一
- 資料採集與融合技術作業2
- 資料採集與融合實踐作業三
- 資料採集與技術融合作業3
- 資料採集與融合技術作業四
- 資料採集與融合技術作業4
- Oracle AWR資料採集Oracle
- JavaCV 採集攝像頭和麥克風資料推流直播Java
- Halcon採集影像Image Acquisition解析UI
- 【Python資料採集】國家自然科學基金大資料知識管理服務門戶資料採集Python大資料
- 資料採集知識分享|4大資料採集方式都有什麼?大資料
- Java 輸入輸出流Java
- JAVA輸入輸出流Java
- Java中資料輸入輸出流——DataInputStream和DataOutputStreamJavaAI
- 與小卡特一起學python 第22章 檔案輸入與輸出Python
- 地圖資料採集,包括百度地圖採集,高德地圖採集,360地圖採集地圖
- 醫學影像大資料與智慧醫療大資料
- phpQuery採集網站資料PHP網站
- 遊戲平臺採集資料遊戲