忍者ブログ

設備のマニアどっとこむ

IoT開発、設備・DIYのブログ!

OpenCVでカメラを動かす

前回やっとこさ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()
↓わりと落ち着きませんがマーカーに目掛けてカメラの首を振っています。






拍手[0回]

PR

コメント

翻訳(Translate)

プロフィール

HN:
佐々木 雅史
性別:
男性
自己紹介:
2021年 ラズパイ、M5stackを用いたIoT開発を専門で受注するアルティメンテを設立。代表を務める。
・2020年ラズパイコンテスト優良賞受賞
・設備系資格多数(電験3種、消防設備士甲4、2級ボイラー技士、危険物乙4、電工2種、技術士補(電気・電子)、エネ電、フォークリフトなど)

AD

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30