ライン内で加工不良が出ます。
不良の出る原因がわかればその原因を取り除けば対策完了です。
しかし、原因がわからない場合があります。今回はその中でも、怪しい箇所が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()
"""
"""