忍者ブログ

設備のマニアどっとこむ

設備、電子工作、DIYのブログ!

03/31

Sat

2018

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

Comment

お名前
タイトル
E-MAIL
URL
コメント
パスワード

翻訳(Translate)

AD

シェアしてね

プロフィール

HN:
アルティメット雅史
性別:
男性
自己紹介:
製油所、データセンター、化学工場を渡り歩いた設備のマニア
最近はarduino,Raspberry piyear等の電子工作にハマる。
取得資格は電験3種、消防設備士甲4、2級ボイラー技士、危険物乙4、電工2種、技術士補(電気・電子)、エネ電、フォークリフトほか

カウンター

お問い合わせ

忍者アクセスランキング

Copyright © 設備のマニアどっとこむ : All rights reserved

TemplateDesign by KARMA7

忍者ブログ [PR]