本文概述了可在 Python 中使用 AI 視覺感測器的函數,以及如何使用它們的簡單說明。 您將了解使用AI視覺感測器過程中的四個步驟:獲取數據、查看獲取的物體數量、從數據中選擇要使用的物體以及從物體中提取哪些數據。
使用AI視覺感測器獲取視覺數據
為了從周圍環境收集訊息,人工智慧視覺感測器會拍攝目前所看到的影像。 它用指定的Visual Signature 標識的任何物件都會放入一個元組中,然後可以由其他函數使用。
拍攝快照
使用 take_snapshot
指令時,您需要建立一個變數來儲存它所建立的元組。 任何視覺簽名 都需要先進行配置,然後才能用作參數。 使用函數時,將簽章參數指定為感測器名稱、雙下劃線,後面接著視覺簽章名稱。
Vision_objects = ai_vision_6.take_snapshot(ai_vision_6__Blue)
Vision_objects = ai_vision_6.take_snapshot(ai_vision_6__Red)
Vision_objects = ai_vision_6.take_snapshot(ai_vision_6__Green)
當您開始輸入括號的開頭時,您的 Visual Signature 選項也會在 VEXcode 中自動填入。
例子
在此範例中,變數 Vision_objects
儲存一個元組,其中包含從名為 ai_vision_6
的 AI 視覺感測器偵測到的 視覺簽章。 它顯示偵測到的物體數量,並每 0.5 秒擷取一個新快照。
while True:
# 拍攝快照以建立偵測到的物件的元組
Vision_objects = ai_vision_6.take_snapshot(ai_vision_6__Blue)
Brain.screen.clear_screen()
Brain.screen.set_cursor(1, 1)
Brain. screen .print("物件計數:", len(vision_objects))
wait(0.5, 秒)
確定要偵測到多少個物體
len
指令可與元組一起使用。 這可用來檢視 take_snapshot
指令在元組中儲存了多少個物件。
最佳實踐是始終確保在嘗試從快照中提取任何資訊之前已檢測到物件。 為此,請使用 len
命令和儲存元組的變數。
len(視覺物件) > 0
例子
在此範例中,變數 Vision_objects
儲存一個元組,其中包含從名為 ai_vision_6
的 AI 視覺感測器偵測到的 視覺簽章。 它顯示偵測到的物體數量,並每 0.5 秒擷取一個新快照。 但是,如果它偵測到一個對象,它將列印偵測到的對象數量。
while True:
# 拍攝快照以建立偵測到的物件的元組
Vision_objects = ai_vision_6.take_snapshot(ai_vision_6__Blue)
# 清除螢幕/重置,以便我們可以顯示新資訊
Brain.screen.clear_screen()
Brain . screen.set_cursor(1, 1)
if len(vision_objects) > 0:
# 列印找到了多少個物體
Brain.screen.next_row()
Brain.screen.print("object count:", len( vision_objects) ))
等待(0.5, 秒)
透過對元組使用 len
指令,您還可以查看偵測到的物件數量。
選擇要從中取得資料的對象
有兩種方法可以從元組中提取資料。 一種方法是使用 ai.vision.largest_object()
函數直接從最近使用 take_snapshot
指令中偵測到的最大物件中擷取資訊。 另一種方法涉及指定特定變數和物件索引。
ai.vision.largest_object()
ai.vision.largest_object()
是一個輔助函數,用於存取元組中最大的對象,但僅適用於最新的快照。
while True:
# 拍攝快照以建立偵測到的物件的元組
Vision_objects = ai_vision_6.take_snapshot(ai_vision_6__Blue)
# 清除螢幕/重置,以便我們可以顯示新資訊
Brain.screen.clear_screen()
Brain . screen.set_cursor(1, 1)
# 拉取資料前檢查物件是否存在
if len(vision_objects) > 0:
Brain.screen.print(Center X: ", ai_vision.largest_object().centerX)
else :
Brain.screen.print("無物件")
wait(0.5, 秒)
在此範例中,程式碼先檢查物件是否存在,然後使用 ai.vision.largest_object()
函數傳回偵測到的最大物件的 .centerX
屬性並列印它。
視覺物件[0]
從元組中提取資料的另一種方法是直接呼叫儲存元組的變數。 在括號中,指定要從中提取資料的物件的索引。 傳回的物件元組始終首先在索引 0 處列出最大的物件。 隨後,物件按從最大到最小的順序排列。
while True:
# 拍攝快照以建立偵測到的物件的元組
Vision_objects = ai_vision_6.take_snapshot(ai_vision_6__Blue)
# 清除螢幕/重置,以便我們可以顯示新資訊
Brain.screen.clear_screen()
Brain . screen.set_cursor(1, 1)
# 拉取資料前檢查物件是否存在
if len(vision_objects) > 0:
Brain.screen.print(Center X: ", Vision_object[0].centerX)
else :
Brain.screen.print("無物件")
wait(0.5, SECONDS)
在此範例中,程式碼在使用 Vision_object[0]
函數傳回 0 索引物件的 .centerX
屬性並列印之前檢查物件是否存在。
選擇要從物件中提取哪些數據
每個物件有八個可以調用的屬性。
。高度
。寬度
.centerX
.centerY
.originX
.originY
。角度
.存在
。高度
.height
屬性傳回偵測到的物件的高度(以像素為單位)。
使用此程式碼傳回 .height
屬性:
視覺物件[0].高度
.height
屬性將傳回 0 到 240 像素之間的值。
。寬度
.width
屬性傳回偵測到的物件的寬度(以像素為單位)。
使用以下程式碼回傳 .width
屬性:
視覺物件[0].寬度
.width
屬性將傳回 0 到 320 之間的值。
.centerX
.centerX
屬性報告偵測到的 視覺簽名中心的 X 座標。
使用以下程式碼回傳 .centerX
屬性:
視覺物件[0].centerX
.centerX
屬性將傳回 0 到 320 之間的數字。
.centerY
.centerY
屬性報告偵測到的 視覺簽名中心的 Y 座標。
使用以下程式碼回傳 .centerY
屬性:
視覺對象[0].centerY
.centerY
屬性 將傳回 0 到 240 之間的數字。
.originX
.originX
屬性報告偵測到的 視覺簽名的最左上角的 X 座標。
使用此程式碼傳回 .originX
屬性:
視覺對象[0].originX
.originX
屬性將傳回 0 到 320 之間的數字。
.originY
.originY
屬性報告偵測到的 視覺簽名的最左上角的 Y 座標。
使用此程式碼傳回 .originY
屬性:
視覺對象[0].originY
.originY
屬性將傳回 0 到 240 之間的數字。
。角度
.angle
屬性傳回 顏色代碼的 角度值。
使用以下程式碼回傳 .angle
屬性:
視覺物件[0].角度
.angle
屬性傳回偵測到的 顏色代碼的 方向,範圍從 0 到 359.99 度。
.存在
.exists
是一個布林屬性,如果它是有效對象,則傳回 true。
如果物件無效,例如使用負整數,它將傳回 false。 如果某個物件無效,則所有其他屬性將傳回 0 作為其值。
while True:
# 拍攝快照以建立偵測到的物件的元組
Vision_objects = ai_vision_6.take_snapshot(ai_vision_6__Blue)
# 清除螢幕/重設以便我們可以顯示新資訊
Brain.screen.clear_screen()
Brain.screen .set_cursor(1, 1)
if Vision_objects[0].exists:
Brain.screen.print("x:", Vision_objects[0].centerX)
else:
Brain.screen.print("無物件" )
等待(0.1,秒)
在此範例中,程式碼檢查 .exists
屬性,如果傳回 true,則會將 .centerX
屬性值列印到 Brain。 如果 .exists
屬性傳回 false,則會列印不存在物件。