監視カメラで撮影した画像を自動でSlackにアップロードする方法

画像確認はSlackが便利

こんにちは。

AI coordinatorの清水秀樹です。

前回紹介した動体撮影に特化した監視カメラの作成方法で、保存した写真をどうやって簡単に確認できるか模索していたところ、Slackにアップロードする技を紹介している記事を見つけたので、それを参考に実装してみました。

 

Slackはリアルタイムにすぐに確認できる便利なツール

監視カメラで撮影した写真をローカルに保存しておくだけでは、いちいち確認のたびにファイルを開く必要があります。

また外出してしまったら、外部からそのファイルを参照する術がありません。

それならば、メールで写真を送信すれば良いのでは?とも考えました。

メールなら外出先でも確認できますし、見たいときに直ぐ確認できます。

ただ、メールも一々ファイルを開いて確認する必要があるのと、撮影される度に毎回送信されてくることを考えると、メールの量が多すぎて確認が大変なんてことにもなりかねません。

結局メール送信も確認する上では便利ではありません。

 

参考にさせて頂いたサイトの紹介

そんな感じで色々悩んでいたところ、下記サイトでSlackを使った画像確認方法を紹介しているサイトを見つけたわけです。

はじめてのRaspberry PIで監視カメラを作ってみた。

情報提供有難うございます。

しかも簡単に実装できます。

 

そんなわけで実装してみました

以下のソースコードを付け加えるだけです。

from slacker import Slacker
token = "xxxxxxxxxx"
slacker = Slacker(token)
channel_name = "#" + "general"
result = slacker.files.upload(ファイルのpath, channels=['xxxxxxxx'])

tokenとchannelsを指定すれば画像をアップロードできます。

tokenのchannelsを取得方法については色々なサイトで紹介されているので、そちらを参考にしてください。

ファイルのpathにアップロードしたいファイルを指定してください。

 

サンプルソースコード

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from datetime import datetime
from slacker import Slacker

def flame_sub(im1,im2,im3,th,blur):

    d1 = cv2.absdiff(im3, im2)
    d2 = cv2.absdiff(im2, im1)
    diff = cv2.bitwise_and(d1, d2)
    # 差分が閾値より小さければTrue
    mask = diff < th
    # 背景画像と同じサイズの配列生成
    im_mask = np.empty((im1.shape[0],im1.shape[1]),np.uint8)
    im_mask[:][:]=255
    # Trueの部分(背景)は黒塗り
    im_mask[mask]=0
    # ゴマ塩ノイズ除去
    im_mask = cv2.medianBlur(im_mask,blur)

    return  im_mask

if __name__ == '__main__':

    cam = cv2.VideoCapture(0)
    
    #写真撮影用初期パラメータ/2秒以上の間隔で撮影
    last_time = datetime.now()
    interval = 10
    #cam.set(3, 640)  # Width
    #cam.set(4, 380)  # Heigh
    im1 = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)
    im2 = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)
    im3 = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)

    while True:
        # フレーム間差分計算
        im_fs = flame_sub(im1,im2,im3,5,7)
        cv2.imshow("Motion Mask",im_fs)
        
        #輪郭を検出
        cunts = cv2.findContours(im_fs,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[1]        
        ret, frame = cam.read()
        
        Photo = False
        
        #四角で囲む/小さい物体無視
        for pt in cunts:
            x,y,w,h = cv2.boundingRect(pt)
            if w < 100: continue
            cv2.rectangle(frame, (x, y), (x+w, y+h),(0, 255, 0), 3)
            
            Photo = True
        
        #撮影は2秒以上の間隔で撮影
        if Photo:
            now = datetime.now()
            fntime = lambda n : int(n.strftime('%S'))
            sec = fntime(now) - fntime(last_time)
            
            #print(fntime(now))
            #print(fntime(last_time))
            
            
            if sec < 0:
                sec = sec * -1
            print(sec)
            
            if sec > interval:
                #動いている物体の画像を保存する
                f = now.strftime('%Y-%m-%d-%H-%M-%S') + ".jpg"
                cv2.imwrite(f,frame)
                last_time = now
                
                #Slackにアップロードする
                token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                slacker = Slacker(token)
                channel_name = "#" + "general"
                result = slacker.files.upload(f, channels=['xxxxxxxx'])
        
        cv2.imshow("Input",frame)
        
        im1 = im2
        im2 = im3
        im3 = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)
        key = cv2.waitKey(10)
        # Escキーが押されたら
        if key == 27:
            cv2.destroyAllWindows()
            break

 

結果

キタキタキターーーーーーーー

素早く、そしてスクロールでみれるこの快適さ。

たった数行だけで、こんなに便利に使えるなんて言うことないですね。

しかも無料です。

 

ぜひお試しあれ。

 


その他の物体検出記事はこちらから

 

それではまた

あなたにオススメの記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

PAGE TOP