忍者ブログ

設備のマニアどっとこむ

設備、電子工作、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

03/04

Sun

2018

OpenCV ×顔認証×Lチカ

 先日raspberry piでウワサのOpenCVをインストールしてみた。インテルが開発したオープンソースの画像処理らしいけど、気軽な気持ちでやれるシロモノではなかった。

まずインストールする前のビルド?で大苦戦した。こちらの記事を参考にさせて頂いたのだが、ビルド用のディレクトリを作った後ハマってしまった

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules -D BUILD_EXAMPLES=ON ..

この後ビルド5%~12%ぐらいで以下のエラーが出て中断。

/usr/include/c++/6/cstdlib:75:25: fatal error: stdlib.h: そのようなファイルやディレクトリはありません
#include_next <stdlib.h>
arduinoでC言語っぽいもの?は勉強していたもののさっぱりわからず。

いろいろ調べると -D ENABLE_PRECOMPILED_HEADERS=OFF というのを加えると解決した。

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D 
INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules -D
BUILD_EXAMPLES=ON -D ENABLE_PRECOMPILED_HEADERS=OFF ..

これでなんとかビルドできたのだがインストール後にサンプルのpythonコードを使って確認しようとすると

ImportError: No module named cv2 と出てインポートできず・・

とりあえずpythonのシェルモードで確認するとバージョン2.7のみimportが反応した。どうやら
ラズパイのコンソールThonnyがpython3.5.2だったためエラーになったみたいだ。

LXターミナルから sudo python ファイル名でたたくとなんとか動作した。(python2.7で起動)
 
長かった・・。 ついでなのでサンプルコードを少しいじって顔を認識するとLEDが光る様にしてみた。(GPIO18ピン使用)
# -*- coding: utf-8 -*-
import sys
import cv2  
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
if _name_ == '_main_':
    try:
      
        cascade_path = "haarcascade_frontalface_alt.xml"
        cascade = cv2.CascadeClassifier(cascade_path)
        capture = cv2.VideoCapture(0)
        if capture.isOpened() is False:
            raise IOError("VideoCapture could not open.")
       
        while True:
           
            ret, image = capture.read()
            if ret == False:
                continue
           
            facerect = cascade.detectMultiScale(image, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))
           
            color = (255, 255, 255)     
            for rect in facerect:
                cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=2)
                GPIO.output(18, True)
                time.sleep(1)
                GPIO.output(18, False)
                
                
            
            cv2.imshow("FaceDetection", image)
            #wait[ms]
            cv2.waitKey(10)
    except KeyboardInterrupt  :         
        print("\nCtl+C")
    except Exception as e:
        print(str(e))                   
    finally:
        capture.release()              
        cv2.destroyAllWindows()         
        for i in range (1,5):
            cv2.waitKey(10)             
        print("\nexit program")         
    GPIO.cleanup(18)
今回はハマるポイントが多くてキツかったです!!





拍手[0回]

02/25

Sun

2018

raspberry piで温度監視GUI (Tkinter編)

raspberry pi でちょっとしたGUIチャレンジしてみた。タッチパネルで監視とボタンだけの単純なものだがかなり苦労した。


今回PythonのTkinterというGUI用のモジュールを使ったのだけどPythonのバージョンでちょっと大文字、小文字違うとエラーが出たりと、プログラム初心者には厳しいところが多々あった。

といってもできてしまうとなんでもないので一例を紹介したいと思う。
温度はraspberry piの本体CPUから取得した。
import sys
import tkinter
from tkinter import Tk, ttk, PhotoImage
root = tkinter.Tk()
root.geometry("800x800")
canvas = tkinter.Canvas(root, width = 800, height = 800)
im = PhotoImage(file = 'on.gif')
im2 = PhotoImage(file = 'off.gif')
canvas.create_image(450,200,image = im2 ) 
def draw(event):
    
    def get_temp():
      f = open("/sys/class/thermal/thermal_zone0/temp","r")
      tmp = 0
      for t in f:
         tmp = t[:2]+"."+t[2:5]
      f.close()
      return float(tmp)
    if __name__=='__main__':
        temp = get_temp()
        print(str(temp))
    if  44>temp > 43 :
        canvas.create_line(90,180,90,160,100,170,90,180,tag="p4")
        canvas.delete("p2")
        canvas.delete("p")
        canvas.delete("p3")
    if 43 > temp > 42 :
        canvas.create_line(90,190,90,170,100,180,90,190,tag="p3")
        canvas.delete("p2")
        canvas.delete("p")
        canvas.delete("p4")
    if 42 > temp > 41 :
        canvas.create_line(90,200,90,180,100,190,90,200,tag="p")
        canvas.delete("p2")
        canvas.delete("p3")
        canvas.delete("p4")
    if 41 > temp > 40 :
        canvas.create_line(90,210,90,190,100,200,90,210,tag="p2")
        canvas.delete("p")
        canvas.delete("p3")
        canvas.delete("p4")
    if 40 > temp > 30 :
        canvas.create_line(90,220,90,200,100,210,90,220,tag="p3")
        canvas.delete("p")
        canvas.delete("p2")
        canvas.delete("p4")
    else :
        canvas.create_image(450,200,image = im2 ) 
def draw2(event):
     
        canvas.create_image(450,200,image = im )  
    
canvas.create_line(100,100,100,500,tag="o")
canvas.create_text(110,90, text = '温度')
canvas.create_text(115,110, text = '50')
canvas.create_text(115,160, text = '45')
canvas.create_text(115,210, text = '40')
canvas.create_text(115,260, text = '35')
canvas.place(x=0, y=0)
button_draw = tkinter.Button(root, text=u'温度',width=15)
button_draw.bind("<Button-1>",draw)
button_draw.place(x=100,y=0)
button_draw = tkinter.Button(root, text=u'on',width=15)
button_draw.bind("<Button-1>",draw2)
button_draw.place(x=350,y=0)
root.mainloop()

ちなみに同じディレクトリにon.gifとoff.gifを作成しなければならない。※jpgでは動作しないので注意。温度バーを作るときにもっといいやり方があるんだと思うけどif文で場合分けするので精一杯

ボタンを押すと・・。


ON!!
↓ちなみに購入したタッチパネルモニターはこれ





拍手[0回]

02/10

Sat

2018

Raspberry pi とBlynkで超絶IoT

以前にarduinoやESP32で遠隔操作で使っていたBlynkだが、Raspberry piでも使えるみたいなので使い方をレクチャーしたいと思う。

 Raspberry pi3ではWi-Fi環境であればインターネットにつなぐのは簡単なのでarduinoで動かすより楽勝かもしれない。アプリ側の設定はこちら参照お願いします。

まずはハードウェア設定でRaspberry pi3と選択しトークンを入手します。

Raspberry piの設定はLXターミナルで以下の順でOKです。

mkdir blynk
cd blynk
git clone https://github.com/blynkkk/blynk-library.git
cd blynk-library/linux
make clean all target=raspberry

あとは作成したディレクトリの場所でトークンとともに実行するだけです。
cd -wiringPi/blynk-library/linux
sudo ./blynk --token=アプリで取得したトークン
[0] Blynk v0.3.8 on Linux
[5001] Connecting to blynk-cloud.com:8442
[5203] Ready (ping: 89ms)

こんな具合で2chのAAみたいな感じでちょっとおしゃれ?です。※トークンは消してます。



あとはGPIOを指定してボタンを作るだけ。
簡単に遠隔でLチカできます。

最近はSlackで温度もわかるし、温度制御でもしようかな・・・。

4/1更新!
slackと連携させてファンで制御します!!






拍手[0回]

02/03

Sat

2018

raspberry pi とslackで温度の遠隔監視

最近やっとラズパイらしい使い方になってきたので今度はAPIにチャレンジしてみた。
意外にもさほど難しくなかったので紹介したい。

Twitterで温度測定してる人は多いみたいだが、自分としてはあまり見られたくないので(鍵アカにすればいいんだけど)slackにしてみた。

まずはslack側でトークンの取得が必要。
incoming-webhookってところからWebhookURLというトークンを取得する。
これをラズパイのパイソンに記入すれば、ラズパイからつぶやく?ことができる。
こんなやつです→https://hooks.slack.com/services/xxxxx

今回はこの記事でつかっている温度センサーADT7410でslackに投稿できるようにしてみました。

コードはこんな感じです。
i2c.py(デスクトップに保存)
import smbus
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
 
i2c = smbus.SMBus(1)
address = 0x48
# coding:utf-8
import requests
import json
block = i2c.read_i2c_block_data(address, 0x00, 12)
temp = (block[0] << 8 | block[1]) >> 3
    
if(temp >= 4096):
    temp -= 8192
print("Temperature:%6.2f" % (temp / 16.0))
time.sleep(1)
               
temp2 = (temp / 16.0)
GPIO.cleanup()
SLACK_URL = "https://hooks.slack.com/services/××××"
#ここだけslackのトークンを入れてください。
def send_slack():
    content = temp2
    payload = {
        "text": content,
        "icon_emoji": ':snake:',
    }
    data = json.dumps(payload)
    requests.post(SLACK_URL, data)
send_slack()

あとはcronでこのパイソンコードを定期的に動作させればOK
まず設定を変更。
crontab -e
最後の行にPythonファイルを実行する様に追記。
* * * * * sudo python /home/pi/Desktop/i2c.py 

そうするとこんな感じででてきます。

とりあえず出先でも家の温度がわかります。いずれ遠隔で設備を動かして温調できればと思ってます。






拍手[0回]

翻訳(Translate)

AD

シェアしてね

プロフィール

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

カウンター

お問い合わせ

忍者アクセスランキング

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

TemplateDesign by KARMA7

忍者ブログ [PR]