산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

자동 비전 개체 추적

이동을 돕는 팬/틸트 서보 장치 카메라가 비전을 사용하여 색상 개체를 자동으로 추적합니다.

스토리

소개

지난 튜토리얼에서 PiCam의 위치를 ​​지정하기 위해 팬/틸트 서보 장치를 제어하는 ​​방법을 살펴보았습니다. 이제 카메라가 자동으로 색상 개체를 추적하도록 장치를 사용합니다.

이것은 OpenCV에 대한 나의 첫 경험이며 고백해야 합니다. 저는 이 환상적인 "오픈 소스 컴퓨터 비전 라이브러리"와 사랑에 빠졌습니다.

OpenCV는 학문적 및 상업적 용도로 무료입니다. C++, C, Python 및 Java 인터페이스가 있으며 Windows, Linux, Mac OS, iOS 및 Android를 지원합니다. 제 OpenCV 튜토리얼 시리즈에서는 Raspberry Pi(OS로서의 Raspbian)와 Python에 중점을 둘 것입니다. OpenCV는 계산 효율성과 실시간 애플리케이션에 중점을 두고 설계되었습니다. 따라서 피지컬 컴퓨팅 프로젝트에 적합합니다!

1단계:BOM – BOM

주요 부분:

(*) 서보가 있는 완전한 팬/틸트 플랫폼을 구입하거나 직접 구축할 수 있습니다.

2단계:OpenCV 3 패키지 설치

최신 버전의 Raspbian(Stretch)으로 업데이트된 Raspberry Pi V3를 사용하고 있으므로 OpenCV를 설치하는 가장 좋은 방법은 Adrian Rosebrock이 개발한 우수한 자습서를 따르는 것입니다. Raspbian Stretch:Install Raspberry Pi의 OpenCV 3 + Python.

파이에 OpenCV를 설치하기 위해 몇 가지 다른 가이드를 시도했습니다. Adrian의 튜토리얼이 최고입니다. 그의 지침에 따라 단계별로 동일한 작업을 수행하는 것이 좋습니다.

Adrian의 튜토리얼을 마치면 Pi에서 실험을 실행할 수 있는 OpenCV 가상 환경이 준비되어 있어야 합니다.

가상 환경으로 이동하여 OpenCV 3가 올바르게 설치되었는지 확인합니다.

Adrian은 시스템 변수가 올바르게 설정되었는지 확인하기 위해 새 터미널을 열 때마다 "source" 명령을 실행할 것을 권장합니다.

소스 ~/.profile

다음으로 가상 환경으로 들어가 보겠습니다.

작업 이력서

프롬프트 앞에 텍스트(cv)가 표시되면 cv 가상에 있는 것입니다. 환경:

(cv) pi@raspberry:~$

Adrian은 cv Python 가상 환경 Raspbian Stretch 다운로드에 포함된 기본 Python 버전과 완전히 독립적이며 격리되어 있습니다. 따라서 전역 site-packages 디렉토리의 Python 패키지는 cv 가상 환경에서 사용할 수 없습니다. 마찬가지로, cv의 site-packages에 설치된 Python 패키지는 Python의 전역 설치에서 사용할 수 없습니다.

이제 Python 인터프리터를 입력합니다.

파이썬

3.5(또는 그 이상) 버전을 실행 중인지 확인

인터프리터 내부(">>>" 표시)에서 OpenCV 라이브러리를 가져옵니다.

cv2 가져오기

오류 메시지가 표시되지 않으면 OpenCV가 PYTHON 가상 환경에 올바르게 설치된 것입니다.

설치된 OpenCV 버전도 확인할 수 있습니다.

cv2.__version__

3.3.0(또는 향후 릴리스될 수 있는 상위 버전)이 나타나야 합니다. 위의 터미널 PrintScreen은 이전 단계를 보여줍니다.

3단계:카메라 테스트

RPi에 OpenCV를 설치했으면 카메라가 제대로 작동하는지 테스트해 보겠습니다.

Raspberry Pi에 PiCam이 이미 설치되어 있다고 가정합니다.

IDE에 아래 Python 코드를 입력하세요.

numpy를 npimport로 가져오기 cv2cap =cv2.VideoCapture(0)while(True):ret, frame =cap.read() frame =cv2.flip(frame, -1) # 카메라를 세로로 뒤집기 회색 =cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('frame', frame) cv2.imshow('회색', 회색) if cv2.waitKey(1) &0xFF ==ord('q'):breakcap.release()cv2.destroyAllWindows()

위 코드는 PiCam에서 생성될 비디오 스트림을 캡처하여 BGR 색상과 회색 모드로 표시합니다.

카메라가 조립된 방식 때문에 수직으로 회전했습니다. 귀하의 경우가 아니라면 "뒤집기" 명령줄에 댓글을 달거나 삭제하십시오.

또는 내 GitHub에서 코드를 다운로드할 수 있습니다. simpleCamTest.py

실행하려면 다음 명령을 입력하십시오.

파이썬 simpleCamTest.py

프로그램을 종료하려면 키보드에서 [q] 또는 [Ctrl] + [C] 키를 눌러야 합니다.

사진은 결과를 보여줍니다.

OpenCV에 대해 자세히 알아보려면 다음 가이드를 따르세요. -video-python-opencv-tutorial 로드 중

4단계:OpenCV를 사용한 Python의 색상 감지

우리가 달성하려고 하는 한 가지는 특정 색상 개체의 감지 및 추적입니다. 이를 위해서는 OpenCV가 색상을 해석하는 방법에 대해 조금 더 이해해야 합니다.

Henri Dang은 OpenCV를 사용한 Python의 색상 감지에 대한 훌륭한 자습서를 작성했습니다.

일반적으로 우리 카메라는 RGB 색상 모드로 작동합니다. RGB 색상 모드는 빨강, 녹색 및 파랑의 세 가지 색상 조명으로 만들 수 있는 모든 색상으로 생각할 수 있습니다. 여기서 대신 BGR(Blue, Green, Red)로 작업하겠습니다.

위에서 설명한 것처럼 BGR에서 픽셀은 파란색, 녹색, 빨간색의 3가지 매개변수로 표현됩니다. 각 매개변수는 일반적으로 0 – 255(또는 16진수의 경우 O에서 FF)의 값을 갖습니다. 예를 들어, 컴퓨터 화면의 순수한 파란색 픽셀은 B 값 255, G 값 0, R 값 0을 갖습니다.

OpenCV는 HSV(색조, 채도, 값) 색상 모델과 함께 작동하며, 이는 RGB 색상 모델의 대안적 표현이며, 컴퓨터 그래픽 연구원이 인간의 방식과 더 밀접하게 일치시키기 위해 1970년대에 설계했습니다. 시각은 색상을 만드는 속성을 인식합니다:

훌륭합니다. 따라서 OpenCV를 사용하여 특정 색상을 추적하려면 HSV 모델을 사용하여 정의해야 합니다.

위 그림에 표시된 플라스틱 상자와 같이 노란색 물체를 추적해야 한다고 가정해 보겠습니다. 쉬운 부분은 BGR 요소를 찾는 것입니다. 모든 디자인 프로그램을 사용하여 찾을 수 있습니다(저는 PowerPoint를 사용했습니다).

제 경우에는 다음을 찾았습니다.

  • 파란색:71
  • 녹색:234
  • 빨간색:213

다음으로 BGR(71, 234, 213) 모델을 상위 및 하위 범위 경계로 정의될 HSV 모델로 변환해야 합니다. 이를 위해 아래 코드를 실행해 보겠습니다.

 sysimport numpy를 npimport cv2blue =sys.argv[1]green =sys.argv[2]red =sys.argv[3] color =np.uint8([[[파랑, 녹색]으로 가져오기 , red]]])hsv_color =cv2.cvtColor(color, cv2.COLOR_BGR2HSV)hue =hsv_color[0][0][0]print("하한은 :"),print("[" + str(hue- 10) + ", 100, 100]\n")print("상한은 :"),print("[" + str(색조 + 10) + ", 255, 255]")

또는 내 GitHub에서 코드를 다운로드할 수 있습니다. bgr_hsv_converter.py

실행하려면 이전에 찾은 BGR 값을 매개변수로 포함하는 아래 명령을 입력하십시오.

파이썬 bgr_hsv_converter.py 71 234 213

이 프로그램은 개체 색상의 상한 및 하한을 인쇄합니다.

이 경우:

하한:[24, 100, 100]

상한:[44, 255, 255]

터미널 PrintScreen에 결과가 표시됩니다.

마지막으로, 색상이 결정되면 OpenCV가 개체를 "마스킹"할 수 있는 방법을 살펴보겠습니다.

import cv2import numpy as np# 그림 읽기 - 1은 BGRimg =cv2.imread('yellow_object.JPG', 1) # 각 axisimg에서 이미지 크기를 20%로 조정합니다. =cv2.resize(img, (0,0), fx=0.2, fy=0.2)# BGR 이미지를 HSV 이미지로 변환hsv =cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # NumPy를 사용하여 하위 및 상위를 저장할 배열 생성 range # "dtype =np.uint8"은 데이터 유형이 8비트 정수임을 의미합니다.lower_range =np.array([24, 100, 100], dtype=np.uint8) upper_range =np.array([44, 255, 255 ], dtype=np.uint8)# 이미지 마스크 생성 =cv2.inRange(hsv, lower_range, upper_range)# 마스크와 이미지를 나란히 표시cv2.imshow('mask',mask)cv2.imshow ('image', img)# 사용자가 [ ESC ]를 누를 때까지 기다립니다.while(1):k =cv2.waitKey(0) if(k ==27):breakcv2.destroyAllWindows()

또는 내 GitHub:colorDetection.py에서 코드를 다운로드할 수 있습니다.

실행하려면 디렉터리에 대상 개체가 포함된 사진이 있는 아래 명령을 입력합니다(내 경우:yellow_object.JPG):

파이썬 colorDetection.py

위 그림은 원본 이미지("이미지")와 마스크를 적용한 후 개체가 어떻게 나타나는지("마스크")를 보여줍니다.

5단계:개체 이동 추적

이제 마스크를 사용하여 개체를 "선택"하는 방법을 알았으므로 카메라를 사용하여 실시간으로 개체의 움직임을 추적해 보겠습니다. 이를 위해 Adrian Rosebrock의 OpenCV로 볼 추적 튜토리얼을 기반으로 코드를 작성했습니다.

Adrian의 튜토리얼을 자세히 읽어보시기 바랍니다.

먼저, imutils 라이브러리가 있는지 확인합니다. 설치되었습니다. Adrian의 OpenCV 편의 기능 모음은 몇 가지 기본 작업(예:크기 조정 또는 화면 뒤집기)을 훨씬 쉽게 만듭니다. 그렇지 않은 경우 아래 명령으로 입력하여 가상 Python 환경에 라이브러리를 설치합니다.

imutils를 pip 설치

다음으로 내 GitHub에서 ball_tracking.py 코드를 다운로드하고 다음 명령을 사용하여 실행합니다.

파이썬 ball_traking.py

기본적으로 "비디오 수직 뒤집기"가 아닌 한 Adrian의 코드와 동일합니다.

프레임 =imutils.rotate(프레임, 각도=180)

또한 사용된 마스크 경계는 이전 단계에서 얻은 것입니다.

6단계:GPIO 테스트

이제 OpenCV의 기본 사항을 다루었으므로 RPi에 LED를 설치하고 GPIO와 상호 작용하기 시작하겠습니다.

위의 전기 다이어그램을 따르십시오. LED의 음극은 GPIO 21에 연결되고 양극은 220옴 저항을 통해 GND에 연결됩니다.

가상 Python 환경 내에서 LED를 테스트해 보겠습니다.

Python 가상 환경에 RPi.GPIO가 설치되어 있지 않을 수 있음을 기억하십시오! 이 문제를 해결하려면 일단 거기에 있으면((cv)가 터미널에 있는지 확인해야 함) pip를 사용하여 가상 환경에 설치해야 합니다.

pip 설치 RPi.GPIO

python 스크립트를 사용하여 간단한 테스트를 실행해 보겠습니다.

시스템 가져오기 시간 가져오기 RPi.GPIO를 GPIO로 가져오기# GPIO 및 변수 초기화redLed =int(sys.argv[1])freq =int(sys.argv[2])GPIO.setmode(GPIO.BCM )GPIO.setup(redLed, GPIO.OUT)GPIO.setwarnings(False)print("\n [정보] 깜박이는 LED(5회)가 {1}초마다 GPIO {0}에 연결됨".format( redLed, freq)) for i in range(5):GPIO.output(redLed, GPIO.LOW) time.sleep(freq) GPIO.output(redLed, GPIO.HIGH) time.sleep(freq)# 약간 cleanupprint("\n [정보] 프로그램 종료 및 정리 \n")GPIO.cleanup()

이 코드는 GPIO 번호와 LED가 깜박여야 하는 빈도(초)를 인수로 받습니다. LED가 5번 깜박이고 프로그램이 종료됩니다. 종료하기 전에 GPIO를 해제합니다.

따라서 스크립트를 실행하려면 매개변수로 LED GPIO를 입력해야 합니다. , 및 빈도 .

예:

파이썬 LED_simple_test.py 21 1

위 명령은 "GPIO 21"에 연결된 빨간색 LED가 "1"초마다 5번 깜박입니다.

GPIO_LED_test.py 파일은 내 GitHub에서 다운로드할 수 있습니다.

위의 터미널 인쇄 화면은 결과를 보여줍니다(물론 LED가 깜박이는지 확인해야 합니다.

이제 OpenCV 및 몇 가지 기본 GPIO 항목으로 작업해 보겠습니다.

7단계:색상 및 GPIO 상호 작용 인식

OpenCV 코드를 GPIO 상호 작용과 통합하기 시작하겠습니다. 마지막 OpenCV 코드로 시작하여 GPIO-RPI 라이브러리를 통합할 것이므로 카메라에서 컬러 개체를 찾을 때마다 빨간색 LED를 켭니다. 이 단계에서 사용된 코드는 Adrian의 훌륭한 튜토리얼인 Raspberry Pi의 OpenCV, RPi.GPIO 및 GPIO Zero를 기반으로 했습니다.

가장 먼저 할 일은 LED를 "생성"하여 특정 GPIO에 연결하는 것입니다.

RPi.GPIO를 GPIOredLed =21GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)GPIO.setup(redLed, GPIO.OUT)으로 가져오기

둘째, LED를 초기화해야 합니다(꺼짐).

GPIO.output(redLed, GPIO.LOW)ledOn =거짓

이제 개체를 찾았을 때 "원"이 생성되는 루프 내부에서 LED를 켭니다.

GPIO.output(redLed, GPIO.HIGH)ledOn =True

내 GitHub에서 전체 코드를 다운로드해 보겠습니다. object_detection_LED.py

다음 명령을 사용하여 코드 실행

파이썬 object_detection_LED.py

다른 개체(색상 및 형식)를 사용해 보십시오. 마스크 경계 내에서 색상이 일치하면 LED가 켜진 것을 볼 수 있습니다.

아래 비디오는 몇 가지 경험을 보여줍니다. 색상 범위 내에 있는 노란색 물체만 감지되어 LED가 켜집니다. 색상이 다른 개체는 무시됩니다.

여기에서는 마지막 단계에서 설명한 대로 LED만 사용합니다. 비디오를 할 때 Pan Tilt가 이미 조립되어 있었으므로 무시하십시오. 다음 단계에서 PAN/TILT 메커니즘으로 처리합니다.

8단계:팬 틸트 메커니즘

이제 OpenCV 및 GPIO의 기본 사항을 다루었으므로 팬/틸트 메커니즘을 설치해 보겠습니다.

자세한 내용은 내 튜토리얼:Pan-Tilt-Multi-Servo-Control

을 참조하세요.

서보를 외부 5V 전원에 연결하고 데이터 핀(제 경우에는 노란색 배선)을 아래와 같이 Raspberry Pi GPIO에 연결해야 합니다.

  • GPIO 17 ==> 틸트 서보
  • GPIO 27 ==> 팬 서보

GND를 함께 연결하는 것을 잊지 마세요 ==> Raspberry Pi – Servo – 외부 전원 공급 장치)

Raspberry Pi GPIO와 서버 데이터 입력 핀 사이에 직렬로 1K 옴의 저항을 옵션으로 가질 수 있습니다. 이렇게 하면 서보 문제가 발생할 경우 RPi를 보호할 수 있습니다.

이 기회를 활용하여 가상 Python 환경 내에서 서보를 테스트해 보겠습니다.

Python 스크립트를 사용하여 드라이버로 몇 가지 테스트를 실행해 보겠습니다.

시간 가져오기 sleepimport RPi.GPIO를 GPIOGPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)def setServoAngle(servo, angle):pwm =GPIO.PWM(servo, 50) pwm .start(8) dutyCycle =angle / 18. + 3. pwm.ChangeDutyCycle(dutyCycle) sleep(0.3) pwm.stop()if __name__ =='__main__':import sys servo =int(sys.argv[1]) GPIO.setup(servo, GPIO.OUT) setServoAngle(servo, int(sys.argv[2])) GPIO.cleanup()

위 코드의 핵심은 setServoAngle(servo, angle) 함수입니다. 이 함수는 인자로 서보 GPIO 번호, 서보가 위치해야 할 각도 값을 받습니다. 이 함수의 입력이 "각도"이면 등가 듀티 사이클로 변환해야 합니다.

스크립트를 실행하려면 매개변수로 servo GPIO를 입력해야 합니다. , 및 각도 .

예:

파이썬 angleServoCtrl.py 17 45

위 명령은 GPIO 17("기울기")에 연결된 서보를 "고도"에서 45도 위치로 지정합니다.

angleServoCtrl.py 파일은 내 GitHub에서 다운로드할 수 있습니다.

9단계:실시간 개체 위치 찾기

여기서 아이디어는 팬/틸트 메커니즘을 사용하여 화면 중앙에 개체를 배치하는 것입니다. 나쁜 소식은 시작하려면 객체가 실시간으로 어디에 있는지 알아야 한다는 것입니다. 하지만 좋은 소식은 객체 중심의 좌표가 이미 있으면 매우 쉽다는 것입니다.

먼저 이전에 사용했던 "object_detect_LED" 코드를 수정하여 생성된 객체의 x,y 좌표를 출력해 보겠습니다.

내 GitHub에서 다운로드 코드:objectDetectCoord.py

코드의 "핵심"은 객체를 찾고 중앙에 빨간 점이 있는 원을 그리는 부분입니다.

# 반경이 최소 크기를 충족하는 경우에만 진행if 반경> 10:# 프레임에 원과 중심을 그리고 # 추적된 점 목록을 업데이트합니다. cv2.circle(frame, (int( x), int(y)), int(radius), (0, 255, 255), 2) cv2.circle(frame, center, 5, (0, 0, 255), -1) # 원의 중심 인쇄 좌표 mapObjectPosition(int(x), int(y)) # led가 아직 켜져 있지 않으면 led가 켜져 있지 않으면 켜십시오. GPIO.output(redLed, GPIO.HIGH) ledOn =True

중심 좌표를 mapObjectPosition(int(x), int(y))으로 '내보냅니다'. 좌표를 출력하기 위한 함수입니다. 기능 아래:

def mapObjectPosition(x, y):print("[INFO] Object Center는 X0 ={0} 및 Y0 ={1}에서 좌표를 지정합니다.".format(x, y))

프로그램을 실행하면 위와 같이 터미널에서 (x, y) 위치 좌표를 볼 수 있습니다. 개체를 이동하고 좌표를 관찰합니다. 우리는 x가 0에서 500(왼쪽에서 오른쪽으로)으로 가고 y가 o에서 350으로(위에서 아래로) 간다는 것을 알게 될 것입니다. 위의 사진을 참조하십시오.

훌륭합니다! 이제 이 좌표를 Pan/Tilt 추적 시스템의 시작점으로 사용해야 합니다.

10단계:물체 위치 추적 시스템

객체가 항상 화면 중앙에 유지되기를 바랍니다. 예를 들어 다음과 같은 경우 객체를 "중앙"으로 간주한다고 정의해 보겠습니다.

  • 220
  • 160

이러한 경계를 벗어나면 편차를 보상하기 위해 팬/틸트 메커니즘을 이동해야 합니다. 이를 기반으로 mapServoPosition(x, y) 함수를 빌드할 수 있습니다. 아래. 이 함수에서 매개변수로 사용된 "x"와 "y"는 중앙 위치를 인쇄하기 위해 이전에 사용한 것과 동일합니다.

# framedef mapServoPosition (x, y):global panAngle global tiltAngle if (x <220):panAngle +=10 if panAngle> 140:panAngle =140 positionServo(panServo, panAngle) if (x> 280):panAngle -=panAngle <40:panAngle =40 positionServo(panServo, panAngle) if (y <160):tiltAngle +=10tiltAngle> 140:tiltAngle =140 positionServo(tiltServo, tiltAngle) if (y> 210):tiltAngle -=tiltAngle <40인 경우 10:tiltAngle =40 positionServo(tiltServo, tiltAngle)

(x, y) 좌표를 기반으로 positionServo(servo, angle) 함수를 사용하여 서보 위치 명령이 생성됩니다. 예를 들어 y 위치가 "50"이라고 가정하면 객체가 거의 화면 상단에 있고 "카메라 시야"가 "낮음"으로 번역될 수 있습니다(기울기 각도가 120도라고 가정해 봅시다). 따라서 틸트 각도를 "줄여야"(예를 들어 100도), 카메라 시야가 "위"가 되고 물체가 화면에서 "아래로" 이동합니다(y는 190도까지 증가합니다).

위 다이어그램은 기하학의 예를 보여줍니다.

팬 카메라가 어떻게 작동할지 생각해 보세요. 화면이 미러링되지 않는다는 점에 유의하십시오. 즉, 개체를 "왼쪽"으로 이동하면 카메라 반대편에 있을 때 화면에서 "오른쪽"으로 이동합니다.

positionServo(servo, angle) 함수는 다음과 같이 작성할 수 있습니다.

def positionServo(서보, 각도):os.system("python angleServoCtrl.py " + str(servo) + " " + str(angle)) print("[INFO] 서보 위치 지정 GPIO {0} ~ {1}도\n".format(서보, 각도))

서보 위치 지정을 위해 이전에 표시된 스크립트를 호출합니다.

angleServoCtrl.py는 objectDetectTrac.py와 동일한 디렉토리에 있어야 합니다.

전체 코드는 내 GitHub에서 다운로드할 수 있습니다. objectDetectTrack.py

11단계:결론

항상 그렇듯이 이 프로젝트가 다른 사람들이 흥미진진한 전자 제품의 세계로 가는 길을 찾는 데 도움이 되기를 바랍니다.

자세한 내용과 최종 코드를 보려면 내 GitHub 보관소를 방문하세요. OpenCV-Object-Face-Tracking

더 많은 프로젝트를 보려면 내 블로그 MJRoBot.org를 방문하세요.

세계 남쪽에서 온 살루도스!

다음 튜토리얼에서 만나요!

감사합니다.

출처: 자동 시력 개체 추적


제조공정

  1. 파이썬 객체 지향 프로그래밍
  2. 라즈베리 파이 볼 추적
  3. 말하다
  4. 실시간 얼굴 인식:종단 간 프로젝트
  5. 파이썬 - 객체 지향
  6. 동적 개체 추적 정확도 결정
  7. 필터는 6D 포즈 추정에서 로봇 비전을 향상시킵니다.
  8. 자동 프레스 기계 란 무엇입니까?
  9. 자동 파워 프레스 란 무엇입니까?
  10. 자동 파이프 벤더란 무엇입니까?