果報は寝て待て: 5月 2021

2021年5月10日月曜日

工場のライン内の監視カメラを作ってみた

 ライン内で加工不良が出ます。

 不良の出る原因がわかればその原因を取り除けば対策完了です。

しかし、原因がわからない場合があります。今回はその中でも、怪しい箇所が4箇所あるラインに監視カメラを つけて調査しました。


 ①カメ;ワークストッカーから搬送用ロボットがワークを取り出す様子を写します

②カメ;取り出した時の角度の、マスターとの微細なズレを測定します。その様子を写します。

③カメ;微細な角度のズレを補正して、旋盤1へ取り付ける様子を写します。

④カメ;微細な角度のズレを補正して、旋盤2へ取り付ける様子を写します。

 

監視カメラの条件

 1、 長時間録画できること (上書き保存できて最新5時間が常に録画)

 2、 4台のカメラで監視できる

 3、 1画面を4分割して録画できる(時間のズレ防止のため)

 4、 時刻もどっかに録画できる

 5、 イベントスイッチを押したら、その以前の録画は上書きされずに残っている

 6、 安い事

カメラはロジクール。これを4台使います。コロナ以前は1000円以下で購入できたのですが今は2500円です。在宅勤務で需要が多いから?

ビデオソフトですが、かゆいところに手が届くソフトはないのでpythonで作ります。コードは最後に添付します。

録画中、以下のような画面になります。 

1秒間に30フレームの仕様ですが実際は20フレームくらいにコマ落ちしてますので再生時は1.5倍速くらいのスピードで再生されます。パソコンの性能によるものと思います。また20分(1200フレーム)で1.2Gbくらいのサイズになります。

画面左上に現在時刻が表示されます。左上がワークをロボットで取り出す所、右上が取り出したワークの位相(角度)を調べる所、左下が旋盤1にワークを取り付ける所 、右下が旋盤2にワークを取り付ける所を録画してます。

 pythonを利用したら1万円くらいで、4カメの監視装置が簡単に構築できる時代です。 

 私の拙いpythonプログラムでも実用になりました。工場での改善活動に挑戦されてる方、pythonにも挑戦してみませんか?

 

 

 

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Mar  4 21:32:24 2021
監視カメラ 4台用
 約20分ごとにビデオをmp4で記録していく
 12ファイルたまれば古いファイルから削除していく
 小文字の z を長押しすれば「event hh:mm:ss 」と表示し、その時点で溜まっているファイルは削除しない
 小文字の q を押せば終了する。
@author: toru
"""

import cv2
import datetime
import os
import time

d = datetime . datetime . now ( )
time_stump = str(d . hour)+":"+str(d . minute)+":"+str(d . second)
print(time_stump)

"""
VideoCapture(*) は0〜4を指定する。
どのカメラが何番になるのかはusbポートに差し込む順番にもより、不明
合成画面を見て変更すること 2134
"""
camera1 = cv2.VideoCapture(2)                
camera2 = cv2.VideoCapture(1)                
camera3 = cv2.VideoCapture(3)                
camera4 = cv2.VideoCapture(4)


# 動画ファイル保存用の設定
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')        # 動画保存時のfourcc設定(mp4用)
fps1 = int(camera1.get(cv2.CAP_PROP_FPS))                    # カメラ1のFPSを取得
w1 = int(camera1.get(cv2.CAP_PROP_FRAME_WIDTH))              # カメラ1の横幅を取得
h1 = int(camera1.get(cv2.CAP_PROP_FRAME_HEIGHT))             # カメラ1の縦幅を取得
print("camera1",fps1, w1, h1)


fps2 = int(camera2.get(cv2.CAP_PROP_FPS))                    # カメラ2のFPSを取得
w2 = int(camera2.get(cv2.CAP_PROP_FRAME_WIDTH))              # カメラ2の横幅を取得
h2 = int(camera2.get(cv2.CAP_PROP_FRAME_HEIGHT))             # カメラ2の縦幅を取得
print("camera2",fps2, w2, h2)


fps3 = int(camera3.get(cv2.CAP_PROP_FPS))                    # カメラ3のFPSを取得
w3 = int(camera3.get(cv2.CAP_PROP_FRAME_WIDTH))              # カメラ3の横幅を取得
h3 = int(camera3.get(cv2.CAP_PROP_FRAME_HEIGHT))             # カメラ3の縦幅を取得
print("camera3",fps3, w3, h3)

fps4 = int(camera4.get(cv2.CAP_PROP_FPS))                    # カメラ4のFPSを取得
w4 = int(camera4.get(cv2.CAP_PROP_FRAME_WIDTH))              # カメラ4の横幅を取得
h4 = int(camera4.get(cv2.CAP_PROP_FRAME_HEIGHT))             # カメラ4の縦幅を取得
print("camera4",fps4, w4, h4)



video_count = 1
video_list = [1]
video_mix = cv2.VideoWriter('video_mix'+str(video_count)+'.mp4', fourcc, fps1, (w1+w2, h1+h2))  # 動画の仕様(ファイル名、fourcc, FPS, サイズ)
print("camera_mix",fps1, w1+w2, h1+h2)  # フレーム数、サイズを合わせないとエラーが出る
start_time = time.time()
print("start",start_time)             # スタート時間             

# 撮影=ループ中にフレームを1枚ずつ取得(qキーで撮影終了)
while True:
    ret, frame1 = camera1.read()              # カメラ1のフレームを取得
#       time_stump in frame1
    d = datetime . datetime . now ( )         #現在時刻を取得
    time_stump = str(d . hour)+":"+str(d . minute)+":"+str(d . second)    #時刻をタイムスタンプに変更
    cv2.putText(frame1, time_stump, (0, 50), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 3, cv2.LINE_AA)      #タイムスタンプをフレーム1に書き込み

    ret, frame2 = camera2.read()              # カメラ2のフレームを取得
    ret, frame3 = camera3.read()              # カメラ3のフレームを取得
    ret, frame4 = camera4.read()              # カメラ4のフレームを取得


    frame_hmix1 = cv2.hconcat([frame1, frame2])  # conect horizonal frame1とframe2を水平方向に結合しframe_hmix1とする
    frame_hmix2 = cv2.hconcat([frame3, frame4])  # conect horizonal frame3とframe4を水平方向に結合しframe_hmix2とする

    frame_mix = cv2.vconcat([frame_hmix1, frame_hmix2])  # conect vurtical frame_hmix1とframe_hmix2を垂直方向に結合しframe_mixとする
    cv2.namedWindow('camera_mix', cv2.WINDOW_NORMAL)
    cv2.imshow('camera_mix', frame_mix)       # frame_mixを画面に表示
    video_mix.write(frame_mix)                # frame_mixをvideo_mixに録画する
    now_time = time.time()
    #    print("now_time",now_time)

    """
    20分(1200)経ったら video_mixを終了し、1繰り上げた番号をつけて保存する
    """
    if now_time - start_time > 1200 : #20min = 1200
        start_time = now_time
        video_mix.release()
        video_count = video_count + 1
        video_mix = cv2.VideoWriter('video_mix'+str(video_count)+'.mp4', fourcc, fps1, (w1+w2, h1+h2))  # 動画の仕様(ファイル名、fourcc, FPS, サイズ)
        
        video_list.append(video_count)    #  video_listに video_countを追加する
        if len(video_list) > 12 : #ファイルが指定数(12)を超えたら、削除する
            path = 'video_mix'+str(video_list.pop(0))+'.mp4'
            if os.path.exists(path) :
                os.remove(path)

    # 'q'を押したらwhileループを抜ける
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    # 'z'を押したら「event」と時間をプリントして削除リストを空にする
    if cv2.waitKey(1) & 0xFF == ord('z'):
        print("event",time_stump)
        video_mix.release()
        start_time = now_time
        video_count = video_count + 1
        video_mix = cv2.VideoWriter('video_mix'+str(video_count)+'.mp4', fourcc, fps1, (w1+w1, h1+h1))  # 動画の仕様(ファイル名、fourcc, FPS, サイズ)
        video_list = []
        video_list.append(video_count)
        


# 撮影用オブジェクトとウィンドウの解放
camera1.release()
camera2.release()
camera3.release()
camera4.release()

video_mix.release()
cv2.destroyAllWindows()

"""
"""