webカメラでQRコードを読み取り,QRコードの情報をcsvファイルに保存,webカメラで写真撮影,webカメラで撮った写真をTwitterに投稿するプログラム

  • プログラムの詳細
  •     

    ・"name,〇〇〇"、"price,〇〇〇"(〇〇〇には、具体的な商品名,値段が入る)という情報が入っているQRコードをパソコンのWebカメラで読み取る。"name,〇〇〇"のQRコードを読み取るとDisplayに'商品名のカードがスキャンされました'と表示される。 (price,〇〇〇の場合は、'値段のカードがスキャンされました'と表示される)。
    ・そして、〇〇〇(商品名,値段)の部分だけcsvファイルに保存される。
    ・その後、スマホをパソコンのwebカメラ(EpocCamというアプリを使用)として繋げ、写真を撮る。この写真と商品名、値段がTwitterに投稿されるプログラムとなっている。

    ・メインプログラムのダウンロード
    ・display1のダウンロード

    プログラムのデモ動画
    ・デモ動画
         
    
    #メインのプログラム
    # モジュール:tkinter を呼び出す関数の定義部分を display1.py に移行
    # モジュール display1の読み込み
    import display1
    
    import tweepy
    
    #取得した各種APIキーを代入する
    CK=""
    CS=""
    AT=""
    AS=""
    
    # Twitterオブジェクトの生成
    auth = tweepy.OAuthHandler(CK, CS)
    auth.set_access_token(AT, AS)
    api = tweepy.API(auth)
    
    #繰り返しの回数
    range_count = 2
    
    #カードの最初の名前(カードを区別するため)
    name_card_firstname = "name,"
    price_card_firstname = "price,"
    
    #カードの名前の長さ
    n = len(name_card_firstname)
    m = len(price_card_firstname)
    
    import cv2
    from pyzbar.pyzbar import decode
    #どのカメラに接続するのか パソコンの前についている付属のカメラ=0 USBカメラ等は、1以降
    cap = cv2.VideoCapture(0)
    
    #for i in range(range_count) :
    #カメラで取得した情報を常時解析するので繰り返し処理にする。
    for i in range(range_count) :
        
        ret, frame = cap.read()
            
        #OpenCVライブラリを使って画像を取得
        #OpenCVでグレースケール化した画像を取得
        #バーコードの読み取りは、カラー画像である必要はない
        img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        height = img.shape[0]
        width = img.shape[1]
        
        #画像が大きすぎると解析に失敗するので画像を半分にしている
        image = cv2.resize(img , (int(width*0.5), int(height*0.5)))
        
        #取得した画像をZbarのdecodeで適応される
        data = decode(image)
        
        #バーコードとして結果が返ってくるか判定
        #読み取れているとdataの中に結果が返ってくるので条件を通る
        if len(data) > 0:
            # 結果が返ってきた場合
                
            z=(data[0][0].decode('utf-8', 'ignore'))
            print(z)
    
            #入力されたカードの最初の名前によって判別(それぞれ、呼び出される関数も分別)
            #入力されたカードの情報(最初の名前を省いたもの)をそれぞれ、変数(a,b)に入れる
            if z [0:n] == name_card_firstname :
                a=z[n:]
                display1.d1()
            elif z [0:m] == price_card_firstname :
                b=z[m:]
                display1.d2()
            else :
                display1.d3()
                #プログラム強制終了
                import sys
                sys.exit()
    
    cap.release()
    
    #それぞれのカード情報をcsvファイルに書き出し、保存
    import csv 
    data = open('account_books.csv','a', newline='')
    x = csv.writer(data)
    x = x.writerow([a,b])
    data.close()
    
    #カメラ
    import datetime
    picture = "photo_" + datetime.datetime.today().strftime('%Y%m%d_%H%M%S') + ".png"
    
    # 内蔵カメラのデバイスIDは0、USBで接続したカメラは1以降。
    capture = cv2.VideoCapture(1)
    
    # 取得した画像データは変数imageに格納。retは取得成功変数。
    ret, image = capture.read()
    
    if ret == True:
        
        # 取得した画像を出力。fileNameは出力する画像名。
        cv2.imwrite(picture, image)
        api.update_with_media(status="商品名:"+a+"\n値段:"+str(b)+"円", filename=picture)
                    
  • display1のプログラム
  •     
    
    #画面表示のプログラム
    
    import tkinter
    
    #呼び出されるとそれぞれのカード名とスキャンされたということが画面に表示される
    #3秒後に閉じる
    def d1() :
        dis = tkinter.Tk()
        dis.geometry("400x200+20+300")
        label = tkinter.Label(text="商品名のカードがスキャンされました",font=(30),height=15)
        label.pack()
        dis.after(3000, lambda: dis.destroy())
        dis.mainloop()
    
    def d2() :
        dis = tkinter.Tk()
        dis.geometry("400x200+20+300")
        label = tkinter.Label(text="値段のカードがスキャンされました",font=(30),height=15)
        label.pack()
        dis.after(3000, lambda: dis.destroy())
        dis.mainloop()
        
    def d3() :
        dis = tkinter.Tk()
        dis.geometry("400x200+20+300")
        label = tkinter.Label(text="別のQRコードが入力されています\n初めからやり直してください",font=(30),height=15)
        label.pack()
        dis.after(3000, lambda: dis.destroy())
        dis.mainloop()
                    
    ゼミのページへ
    ・ゼミページ
    KesuのWebページへ
    Kesuのwebページへ戻る