主題

【Unity + OpenCV(python) 】使用socket跨軟體傳輸資料:Python傳送畫面至Unity、Tcp/Udp傳輸實作

給你加油 %%鼠 | 2022-01-06 23:26:52 | 巴幣 124 | 人氣 521

前言:
上次筆記使用dll傳輸畫面資料不知為甚麼無法正確顯示,這次成功改用電腦內部socket來溝通!


使用UDP

基本的傳輸協定,因為不會檢查是否收到或重傳等資訊,因此封包小、速度較快,缺點是長度上限548 Bytes,不適合串流影片,在此只用來傳輸事件資訊。 好處是就算Unity那端的port沒有開啟,UPD因不會檢查是否收到,所以不會報錯。
成果(發布時放錯影片XD):
Python 傳送資料

C#  UPD 建立連線
使用thread在背景持續接收資訊。

C# 定義接受方法

尋找輪廓的原理先略過,主要流程是轉灰階=>高思模糊=>Canny邊緣偵測=>向外擴張=>findContours(尋找輪廓)
以下是C++:



使用TCP

需經過三項交握確認連線。
若server(這裡是unity)的port沒有開,會收到傳送失敗的exception。

範例 (偵測到完成深蹲後操控遊戲角色跳躍):

Python 建立連線

C# 建立連線

定義接收方法:
我查到好幾個接收方式,好幾個都是預先定義好buffer空間,這邊是不使用buffer的作法。

注意1,由於一開始需要經過三項交握,所以"TCP Initialized"之後會log一次"received something...",該訊息為用來回應tcp連線的。

注意2,在python端sock.close()之前收到的訊息會一直存在sr,直到close之後才一次print出,所以傳輸每frame都會經過:建立連線=>打包資料=>傳送=>close() 的循環。



傳輸畫面

python端:
注意資料只能傳byte,string等型態,所以這邊使用json格式。Python有另一個類次的pickel插件,但該格式只能python使用,不方便給unity。

C#端:
宣告texture:


由於Unity不支援多線程,無法在接收方法中直接設定texture,所以在fixedUpdate中設定。

成功XD~

操控物件也同理,在json資料中夾帶著操作的訊號就好。 但由於是跟著畫面資料一起串流,會有滿嚴重的延遲(?。  不太確定若資料改用UDP、畫面使用TCP傳輸會不會比較好。 hmmm~

送禮物贊助創作者 !
0
留言

創作回應

樂小呈
突然想起來之前看過一個很厲害的東西 https://youtu.be/MbZ0ld1ShFo
2022-01-11 20:10:18
追蹤 創作集

作者相關創作

相關創作

更多創作