前回やっとこさOpenCVをインストールしたのでこれを使ってカメラを動かせないかやってみた。 どうも特定の色にマーカーをつけられるみたいなので、その座標によってサーボーモーターを制御できるようにした。
特定の色に対しマーカーがでてくるので画面の座標を左右で半分に分けて、右側にマーカーが来る場合右にカメラを振り、左側にマーカーが出た場合左側にカメラを振る。
そうすると特定の色についたマーカーが真ん中に来るようになる(はず)
↓参考にしたサイトはこちらです。
http://tony-mooori.blogspot.jp/2015/10/python_27.html?m=1このソースにサーボモーターの制御を組み込んだだけです。
17ピンを使用。ただしサーボモーターは360°用を使っています。
import numpy as np
import cv2
import time
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
gp_out = 17
GPIO.setup(gp_out, GPIO.OUT)
servo = GPIO.PWM(gp_out, 50)
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
low_color = np.array([100, 5, 5])
upper_color = np.array([140, 35, 50])
ex_img = cv2.inRange(hsv,low_color,upper_color)
vvec = np.ones((ex_img.shape[1],1))
hvec = np.ones((1,ex_img.shape[0]))
hvec = np.dot(hvec,ex_img)
vvec = np.dot(ex_img,vvec)
x = np.argmax(hvec)
y = np.argmax(vvec)
cv2.circle(frame,(x,y),10,(0,255,0))
print(x)
cv2.imshow('frame',frame)
time.sleep(2)
if x>330:
servo.start(0.0)
servo.ChangeDutyCycle(6.82)
if x<300:
servo.start(0.0)
servo.ChangeDutyCycle(7.0)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
if key == ord('s'):
path = "photo.jpg"
cv2.imwrite(path,frame)
cap.release()
cv2.destroyAllWindows()
GPIO.cleanup()
↓わりと落ち着きませんがマーカーに目掛けてカメラの首を振っています。