VEXcode V5 Python에서 AI 비전 센서 사용

이 문서에서는 Python에서 AI Vision 센서를 사용하는 데 사용할 수 있는 기능에 대한 개요와 사용 방법에 대한 간단한 지침을 제공합니다. AI 비전 센서를 사용하는 과정에서 데이터 획득, 획득한 객체의 양 확인, 데이터에서 사용할 객체 선택, 객체에서 가져올 데이터의 4단계를 학습합니다.

AI Vision 센서로 시각적 데이터 획득

주변의 정보를 수집하기 위해 AI 비전 센서는 현재 보고 있는 이미지를 촬영합니다. 지정된Visual Signature 로 식별되는 모든 개체는 튜플에 저장되며, 이 튜플은 다른 함수에서 사용할 수 있습니다.

take_snapshot

take_snapshot 명령을 사용할 때 생성되는 튜플을 저장할 변수를 생성해야 합니다. 개의 시각적 서명 을 매개변수로 사용하려면 먼저 구성해야 합니다. 기능을 사용할 때 서명 매개변수를 센서 이름, 이중 밑줄, 그 뒤에 시각적 서명 이름으로 지정하십시오.'보라색', '빨간색', '녹색'이라는 세 가지 색상 설정을 보여주는 색상 선택 도구의 스크린샷입니다. 각 색상에는 슬라이더를 사용하여 색조 범위와 채도 범위를 설정하는 옵션이 있습니다. 색상은 '색상 설정' 버튼 옆의 상자에 시각적으로 표시되며, 각 설정의 오른쪽에 '제거' 버튼(빨간색 X)이 있습니다. '보라색' 색조의 채도 범위는 0.74이고, '빨간색' 색조의 채도 범위는 1.00이며, '녹색' 색조의 채도 범위는 0.38입니다.

비전 객체 = ai_vision_6.스냅샷 찍기(ai_vision_6__보라색)
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에서 자동 완성됩니다.

이 예에서 변수 ai_vision_6라는 AI 비전 센서에서 감지된 시각적 서명 포함하는 튜플을 저장합니다. 감지된 개체 수를 표시하고 0.5초마다 새로운 스냅샷을 캡처합니다.

while True: 

# 감지된 객체의 튜플을 생성하기 위해 스냅샷을 찍습니다
vision_objects = ai_vision_6.take_snapshot(ai_vision_6__Purple)

brain.screen.clear_screen()
brain.screen.set_cursor(1, 1)

brain.screen.print("객체 수:", len(vision_objects))
wait(0.5, SECONDS)

감지된 개체 수 확인

len 명령은 튜플과 함께 사용할 수 있습니다. 이는 take_snapshot 명령이 튜플에 저장한 개체 수를 확인하는 데 사용할 수 있습니다.

스냅샷에서 정보를 가져오기 전에 항상 개체가 감지되었는지 확인하는 것이 가장 좋습니다. 이렇게 하려면 튜플을 저장하는 변수와 함께 len 명령을 사용하세요.

len(vision_objects) > 0

이 예에서 변수 ai_vision_6라는 AI 비전 센서에서 감지된 시각적 서명 포함하는 튜플을 저장합니다. 감지된 개체 수를 표시하고 0.5초마다 새로운 스냅샷을 캡처합니다. 그러나 개체를 감지한 경우 감지된 개체 수를 인쇄합니다.

while True: 
# 감지된 객체의 튜플을 생성하기 위해 스냅샷을 찍습니다
vision_objects = ai_vision_6.take_snapshot(ai_vision_6__Purple)

# 새로운 정보를 표시할 수 있도록 화면을 지우거나 재설정합니다.
brain.screen.clear_screen()
brain.screen.set_cursor(1, 1)

if len(vision_objects) > 0:
# 발견된 객체의 수를 출력합니다.
brain.screen.next_row()
brain.screen.print("객체 수:", len(vision_objects))
wait(0.5, SECONDS)

튜플과 함께 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__Purple)

# 새로운 정보를 표시할 수 있도록 화면을 지우거나 재설정합니다
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, SECONDS)

이 예제에서 코드는 ai.vision.largest_object() 함수를 사용하여 감지된 가장 큰 객체의 .centerX 속성을 반환하고 인쇄하기 전에 객체가 존재하는지 확인합니다.

비전_객체[0]

튜플에서 데이터를 가져오는 또 다른 방법은 튜플을 저장하는 변수를 직접 호출하는 것입니다. 괄호 안에 데이터를 추출하려는 개체의 인덱스를 지정합니다. 반환된 객체 튜플은 항상 가장 큰 객체를 인덱스 0에 먼저 나열합니다. 그 후, 객체는 가장 큰 것부터 가장 작은 것 순으로 정렬됩니다.

while True: 
# 감지된 객체의 튜플을 생성하기 위해 스냅샷을 찍습니다
vision_objects = ai_vision_6.take_snapshot(ai_vision_6__Purple)

# 새로운 정보를 표시할 수 있도록 화면을 지우거나 재설정합니다
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 속성을 반환하고 인쇄하기 전에 개체가 존재하는지 확인합니다.

객체에서 가져올 데이터 선택

각 개체에는 호출할 수 있는 8개의 속성이 있습니다.

  • .키
  • .너비
  • .centerX
  • .centerY
  • .originX
  • .originY
  • .각도
  • .존재한다

.키

.height 속성은 감지된 객체의 높이를 픽셀 단위로 반환합니다.

.height 속성을 반환하려면 다음 코드를 사용하세요.

Vision_objects[0].높이

.height 속성은 0에서 240픽셀 사이의 값을 반환합니다.

.너비

.width 속성은 감지된 객체의 너비를 픽셀 단위로 반환합니다.

.width 속성을 반환하려면 다음 코드를 사용하세요.

Vision_objects[0].width

.width 속성은 0에서 320 사이의 값을 반환합니다.

.centerX

.centerX 속성은 감지된 Visual Signature중심의 X 좌표를 보고합니다.

.centerX 속성을 반환하려면 다음 코드를 사용하세요.

Vision_objects[0].centerX

.centerX 속성은 0에서 320 사이의 숫자를 반환합니다.

.centerY

.centerY 속성은 감지된 Visual Signature중심의 Y 좌표를 보고합니다.

.centerY 속성을 반환하려면 다음 코드를 사용하세요.

Vision_objects[0].centerY

.centerY속성 0에서 240 사이의 숫자를 반환합니다.

.originX

.originX 속성은 감지된 시각적 서명의 가장 왼쪽 위 모서리의 X 좌표를 보고합니다.

.originX 속성을 반환하려면 다음 코드를 사용하세요.

Vision_objects[0].originX

.originX속성은 0에서 320 사이의 숫자를 반환합니다.

.originY

.originY 속성은 감지된 시각적 서명의 가장 왼쪽 위 모서리의 Y 좌표를 보고합니다.

.originY 속성을 반환하려면 다음 코드를 사용하세요.

Vision_objects[0].originY

.originY속성은 0에서 240 사이의 숫자를 반환합니다.

.각도

.angle 속성은 색상 코드의 각도 값을 반환합니다.

.angle 속성을 반환하려면 다음 코드를 사용하세요.

Vision_objects[0].angle

.angle 속성은 감지된 색상 코드의 방향(0~359.99도 범위)을 반환합니다.

.존재한다

.exists 은 유효한 객체인 경우 true를 반환하는 부울 속성입니다. 

음의 정수가 사용되는 경우와 같이 객체가 유효하지 않은 경우 false를 반환합니다. 객체가 유효하지 않으면 다른 모든 속성은 해당 값으로 0을 반환합니다.

while True: 
# 감지된 객체의 튜플을 생성하기 위해 스냅샷을 찍습니다
vision_objects = ai_vision_6.take_snapshot(ai_vision_6__Purple)
# 새로운 정보를 표시할 수 있도록 화면을 지우거나 재설정합니다
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("no object")
wait(0.1, SECONDS)

이 예에서 코드는 .exists 속성을 확인하고, true를 반환하면 .centerX 속성 값을 Brain에 인쇄합니다. 속성이 false를 반환하면 객체가 없다고 인쇄됩니다.

.ID

.id 속성은 감지된 AprilTag의 또는 AI 분류의 식별 번호를 반환합니다.

AprilTag 의 id는 AprilTag 자체와 함께 발견될 수 있습니다.

현재 사용 가능한 AI 분류 는 다음과 같습니다.

교실 요소 경쟁 요소 (High Stakes '24-'25)

0 - 블루볼

0 - 모바일 목표
1 - 녹색 공 1 - 레드 링
2 - 빨간 공 2 - 블루 링
3 - 블루 링  
4 - 그린 링  
5 - 레드 링  
6 - 블루 큐브  
7 - 그린 큐브  
8 - 레드 큐브  
비전 객체[0].id

.점수

.score 속성은 AI 분류에 대한 신뢰 백분율 값(최대 100%)을 반환합니다. 이 점수는 모델이 감지된 AI 분류에 대해 얼마나 확신하는지 나타냅니다. 점수 값이 높을수록 AI 분류의 정확도에 대한 확신도가 높아짐을 나타냅니다.

비전 객체[0].점수

For more information, help, and tips, check out the many resources at VEX Professional Development Plus

Last Updated: