Let’s play with AI.
こんにちは。
AI coordinator管理人の清水秀樹です。
皆さま、自作してますか?
私は色々なガラクタを日々生み出しています。
いずれ役に立つ日が来ることを信じて・・・・
物体追跡カメラを作ってみた。
こんなやつです。
いきなりソースコード
速くソースコード見せろって方はgithubにありますので使ってください。
一応補足しますと、公式サイトにサーボドライバーHATのセットアップ方法がありますので、そちらをまず試しましょう。
サンプルソースコードでウニョウニョ動けばOKです。
あとはラズパイにOpenCVをインストールするだけです。
これで準備完了。
tracking_camera.pyを起動すれば、カラーボール(赤)を追跡するカメラの出来上がり。
一応ソースコード載せときます。
import cv2
import numpy as np
import PCA9685
cap= cv2.VideoCapture(0)
x_medium = 0
y_medium = 0
PCA9685 = PCA9685.PCA9685
pwm = PCA9685(0x40, debug=False)
pwm.setPWMFreq(50)
X_MAX = 2500.0
X_MIN = 500.0
X_HOME = 1500.0
Y_MAX = 2500.0
Y_MIN = 500.0
Y_HOME = 1500.0
W = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
H = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
print('W,H,fps: ', W , H , fps)
def move(x_move, y_move):
pwm.setServoPulse(0,x_move)
pwm.setServoPulse(1,y_move)
move(X_HOME, Y_HOME)
#初期位置
now_degree_x, now_degree_y, move_degree_x, move_degree_y = X_HOME, Y_HOME, 0, 0
while True:
_, frame = cap.read()
hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# red color
low_red = np.array([161, 155, 84])
high_red = np.array([179, 255 ,255])
red_mask = cv2.inRange(hsv_frame, low_red, high_red)
contours, _ = cv2.findContours(red_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=lambda x:cv2.contourArea(x), reverse=True)
for cnt in contours:
(x, y, w, h) = cv2.boundingRect(cnt)
#cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
x_medium = int((x + x + w) / 2)
y_medium = int((y + y + h) / 2)
#640,480
move_degree_x = now_degree_x - (x_medium-320)*0.3
move_degree_y = now_degree_y - (y_medium-240)*0.3
if move_degree_x > X_MIN and move_degree_x < X_MAX:
if move_degree_y > Y_MIN and move_degree_y < Y_MAX:
move(move_degree_x, move_degree_y)
now_degree_x = move_degree_x
now_degree_y = move_degree_y
#print(x_medium,y_medium)
break
cv2.line(frame, (x_medium, 0), (x_medium, 480), (0, 255, 0), 2)
cv2.line(frame, (0, y_medium), (640, y_medium), (0, 255, 0), 2)
cv2.imshow("Frame", frame)
cv2.imshow("mask", red_mask)
key = cv2.waitKey(1)
if key == 27:
break
cap.release()
cv2.destoyALLWindows()
今回は簡単に首振りカメラを作りたかったので、カラートラッキングで試しています。
これが出来れば物体検知AIを使って、人だの犬だの猫だのでも実行できます。
ただ、ラズパイではマシンパワーの課題はあるかと思いますが・・・
2軸カメラマウントの準備
Aliexpressで購入したマウントを使いました。
袋の中に部品がすし詰め状態で郵送されてきましたが、中身は問題なかったです。
Amazonで販売しているこちらの商品でも代替出来ます。
以前はこちらを使っていましたが、組立時にプラスチックを削る作業なんかが発生して面倒くさいので、今回はやめました。
サーボドライバーHAT
これですね。
ラズパイに差し込む形で使用します。
さて組み立てるか
組み立てるとこんな感じで、出来上がり。
どんなニーズに使えるか謎ですが、組み立て後は割と達成感得られるかと思います。
遠隔操作ロボットを作っていると分かるのですが、カメラの魚眼レンズでも視野角狭く感じるので、joystickでウニョウニョカメラの向きを変えられるように使うと便利ですね。
YouTubeでも組み立ての様子を紹介しています。
興味があればご覧ください。
それではまた!!
私もラズパイで物体追従カメラを作ろうとしてしています。ソースコードで質問がありまして、55,56行目の*0.3の値の根拠を教えていただけないでしょうか。