OpenCV에서 색 감지하면서 달리는 자동차 제작 (Rev # 1)

12204 단어 OpenCVRaspberry PI


겨우 1호기가 움직인 곳이므로, 프로그램이 전혀 세련되지 않은 곳은 용서해 주세요. 28호 정도로 AI카라고 불러도 좋은 정도의 레벨이 되어 있으면 좋다(^^;

할 수 있는 일



카메라에 비친 「붉은 색」의 영역을 쫓아 방향 전환을 하면서 전진합니다. "빨간색"을 찾을 수 없으면 중지합니다.

구성


  • Raspberry Pi Zero W
  • Camera Module
  • Pimoroni Explorer PHAT (모터 드라이버)

  • 모바일 배터리
  • TAMIYA 굴삭기 도저 공작 기본 세트 (캐터필라 부분 만)
  • TAMIYA 범용 암 세트 (배터리 및 Raspi 고정 용)

  • 프로그램 준비



    우선 라이브러리 설치. OpenCV를 RaspberryPi에 넣을 때 기본 이미지는 "Desktop"을 선택하는 것이 원활합니다. "Lite"라면 추가 라이브러리가 필요할 수 있습니다. .
    pip3 install --upgrade pip
    pip3 install opencv-python
    sudo apt -y install pimoroni
    pimoroni-dashboard
    

    pimoroni-dashboard는 메뉴 형식의 앱이므로 ExplorerPHAT를 찾아 드라이버와 샘플 프로그램을 설치합니다.

    프로그램은 다음과 같습니다. 카메라에서 얻은 이미지를 HSV 색 공간으로 변환하고 색조가 빨간색 영역을 추출하고 그 중 가장 큰 면적을 가진 영역의 중심 좌표를 찾습니다. 좌우 모터의 속도를 조정하여 좌표 방향으로 방향타를 자릅니다. 일정 이상의 크기의 영역을 찾을 수 없을 때는 모터를 멈추고 있습니다.

    cvcar.py
    import time
    import picamera
    import picamera.array
    import cv2
    import numpy as np
    import explorerhat
    
    DEBUG = False
    
    low = np.array([160,128,128])
    high = np.array([200,255,255])
    
    camera = picamera.PiCamera()
    camera.resolution = (640,480)
    camera.vflip = True
    camera.hflip = True
    camera.start_preview()
    time.sleep(1)
    camera.stop_preview()
    
    r = explorerhat.motor.one
    l = explorerhat.motor.two
    
    def get_target():
      global camera
      stream = picamera.array.PiRGBArray(camera)
      camera.capture(stream, format='bgr')
      image = stream.array
      hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
      mask = cv2.inRange(hsv, low, high)
      contours,_ = cv2.findContours(mask,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
      cx, cy, max_a = -1,-1,0
      for i in range(0,len(contours)):
        if len(contours[i]) == 0: continue
        x,y,w,h = cv2.boundingRect(contours[i])
        a = cv2.contourArea(contours[i])
        if a < 1000: continue
        if a > max_a:
          cx = x + w/2
          cy = y + h/2
          max_a = a
      if DEBUG:
        cv2.imshow("image",image)
        cv2.imshow("debug",mask)
        cv2.waitKey(0)
      return (cx,cy)
    
    w = camera.resolution[0]
    
    while True:
      x,y = get_target()
      p = x/w if x > -1 else -1 # 0.0 - 1.0 or -1(not found)
      print("%.1f" % (p))
      if p == -1:
        r.forward(0)
        l.forward(0)
      elif p > 0.6:
        r.forward(70)
        l.forward(20)
      elif p < 0.4:
        r.forward(20)
        l.forward(70)
      else:
        r.forward(70)
        l.forward(70)
      time.sleep(0.1)
    

    crontab에 쓰면 RaspberryPi가 켜지면 자동으로 실행됩니다 (스크립트는 $ HOME에 놓여 있다고 가정합니다).
    @reboot python3 cvcar.py
    

    TODO: 한번 더 설치를 처음부터 해본다(설명이 새는 라이브러리가 있을 것 같아?).
    TODO: OpenCV에서 처리한 도중 경과의 이미지를 추가한다.

    좋은 웹페이지 즐겨찾기