PythonでOoenCV&numpy&pyzbarを使ってカメラからQRコード出力【windows10】

OpenCV ver.4.1.2
numpy ver.1.18.1
pyzber ver.0.1.8

を使用してWindows10にUSBカメラを接続してQRコードを読み込んでみました。

環境:
windows10 64bit home 1909
anoconda3
Python3.7

スポンサーリンク
スポンサーリンク

ライブラリのインストール

pip install opencv-python

pyzberのインストールはこちらに書いています。↓

環境 windows10 64bit 1803 Anaconda3 Python 3.7 Pycharm2019.3 QRコードの...

numpyはAnacondaにインストールしてありましたので、割合します。

カメラの接続を確認する

まず、パソコンに標準で付いているカメラかUSBでカメラを接続して確認してみます。

カメラが認識しているか確認してみる。引数には「 -1 0 1」など色々試してみる

import cv2

cap_cam = cv2.VideoCapture(0)
print(type(cap_cam))

結果

<class 'cv2.VideoCapture'>

Trueが返ってくれば正常

print(cap_cam.isOpened())

結果

True

カメラが接続できない場合はexitでPythonの接続を閉じます。

if not cap_cam.isOpened():
    print("カメラを開けません")
    exit()

フレームごとにキャプチャ

次にフレーム毎にキャプチャするように設定します。

参考: https://docs.opencv.org/4.1.2/dd/d43/tutorial_py_video_display.html

import cv2
import numpy as np
from pyzbar.pyzbar import decode

#QRコードのコントラスト調整用の関数
def edit_contrast(image, gamma):
    """コントラスト調整"""
    look_up_table = [np.uint8(255.0 / (1 + np.exp(-gamma * (i - 128.) / 255.)))
        for i in range(256)]
    result_image = np.array([look_up_table[value]
                             for value in image.flat], dtype=np.uint8)
    result_image = result_image.reshape(image.shape)
    return result_image

#カメラ認識
cap_cam = cv2.VideoCapture(0)
cv2.namedWindow('frame')
# カメラが接続できない場合は、exit
if not cap_cam.isOpened():
    print("カメラを開けません")
    exit()

while True:
    # フレームごとにキャプチャ
    ret, frame = cap_cam.read()
    #フレームが正しく読み取られた場合、retはTrue
    if not ret:
        print("フレームは受信できません。終了しています...")
        break

    # グレースケール化してコントラストを調整する
    gray_scale = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    image = edit_contrast(gray_scale, 5)

    # 結果のフレーム表示
    cv2.imshow('frame',gray_scale)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

    # 加工した画像からフレームQRコードを取得してデコードする
    codes = decode(image)
    if len(codes) > 0:
        output = codes[0][0].decode('utf-8', 'ignore')
        print(output)
        # CSVファイルに書き込み
        # output_csv = output
        with open('qr.csv', 'w') as csv_file:
            writer = csv.writer(csv_file,
                                lineterminator='\n')  # 改行コード(\n)を指定しておく
            writer.writerow([output])
        if 'output' != None:
            #cap_cam.read()
            cap_cam.release()

# すべて完了したらキャプチャーを解放する
#cap_cam.release()
cv2.destroyAllWindows()
スポンサーリンク
スポンサーリンク
SNSフォローボタン

フォローする

シェアする

  • このエントリーをはてなブックマークに追加
スポンサーリンク
スポンサーリンク