トップページ人工知能,実世界DBOpenCV のプログラム例Python + OpenCV 4 でビデオカメラ画像の表示、ファイル書き出し、濃淡画像処理

Python + OpenCV 4 でビデオカメラ画像の表示、ファイル書き出し、濃淡画像処理

目次

【サイト内の関連ページ】

前準備

Python のインストール,pip と setuptools の更新,Python 開発環境

Python の URL: http://www.python.org/

【Python, pip の使い方】

Python, pip は,次のコマンドで起動できる.

Python 開発環境のインストール】

Python 用 opencv-python 4.3 のインストール

Windows の場合

コマンドプロンプトで次のコマンドを実行

python -m pip install -U opencv-python

Ubuntu の場合

端末で次のコマンドを実行

sudo apt -y update
sudo apt -y install libopencv-dev python3-opencv
  • ラズベリーパイ の場合

    端末で次のコマンドを実行

    sudo apt -y update
    sudo apt -y install libopencv-dev python3-opencv python3-opencv-apps
    

    カメラ画像の表示

    USB接続できるビデオカメラを準備し,パソコンに接続しておく.

    Python プログラムを動かすために, Windows では「python」, Ubuntu では「python3」などのコマンドを使う.

    あるいは, 開発環境や Python コンソール(Jupyter Qt ConsoleSpyderPyCharmPyScripter など)の利用も便利である.

    あるいは,オンラインで動くGoogle Colaboratory のノートブックの利用も,場合によっては便利である.

    import cv2
    import numpy as np
    
    v = cv2.VideoCapture(0)
    while(v.isOpened()):
        r, f = v.read()
        if ( r == False ):
            break
        cv2.imshow("", f)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    v.release()
    cv2.destroyAllWindows()
    

    ※ 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

    カラー画像から濃淡画像への変換

    USB接続できるビデオカメラを準備し,パソコンに接続しておく.

    import cv2
    import numpy as np
    
    v = cv2.VideoCapture(0)
    while(v.isOpened()):
        r, f = v.read()
        if ( r == False ):
            break
        mono = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
        cv2.imshow("", mono)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    v.release()
    cv2.destroyAllWindows()
    

    [image]

    ※ 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

    ビデオファイルの書き出し

    USB接続できるビデオカメラを準備し,パソコンに接続しておく.

    import cv2
    import numpy as np
    
    v = cv2.VideoCapture(0)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    IMROOT="C:/image/"
    out = cv2.VideoWriter(IMROOT + 'output.avi', fourcc, 20.0, (640, 480), False) 
    while(v.isOpened()):
        r, f = v.read()
        if ( r == False ):
            break
        mono = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
        cv2.imshow("", mono)
        out.write(mono)   
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    v.release()
    out.release()
    cv2.destroyAllWindows()
    

    [image]

    ※ 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

    止めると、ビデオファイル C:/image/output.avi ができる。ディレクトリ C:/image は前もって作っておくこと

    ヒストグラム平坦化 (histogram equalization)

    ヒストグラム平坦化は、モノクロ画像の表示をあざやかにするなどで役に立つ方法

    USB接続できるビデオカメラを準備し,パソコンに接続しておく.

    import cv2
    import numpy as np
    
    v = cv2.VideoCapture(0)
    while(v.isOpened()):
        r, f = v.read()
        if ( r == False ):
            break
        mono = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
        equ = cv2.equalizeHist(mono)
        cv2.imshow("", equ)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    v.release()
    cv2.destroyAllWindows()
    

    [image]

    ※ 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

    OTSU の方法による2値化

    import cv2
    import numpy as np
    
    v = cv2.VideoCapture(0)
    while(v.isOpened()):
        r, f = v.read()
        if ( r == False ):
            break
        mono = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
        r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU)
        cv2.imshow("", dst)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    v.release()
    cv2.destroyAllWindows()
    

    [image]

    ※ 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

    輪郭抽出

    ここでの輪郭抽出は、2値化の結果を利用して輪郭を抽出している

    import cv2
    import numpy as np
    
    v = cv2.VideoCapture(0)
    while(v.isOpened()):
        r, f = v.read()
        if ( r == False ):
            break
        mono = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
        r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU)
        contours, hierarchy = cv2.findContours(dst, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        cv2.drawContours(f, contours, -1, (0, 255, 0), 3)
        cv2.imshow("", f)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    v.release()
    cv2.destroyAllWindows()
    

    [image]

    ※ 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

    ビデオファイルを使って試す

    前準備として,ビデオファイルを準備する

    ここで使用するビデオファイル:sample1.mp4

    このビデオファイルのダウンロードは, Windows でコマンドプロンプト管理者として実行し, 次のコマンドを実行.

    mkdir c:\image
    cd c:\image
    curl -O https://www.kkaneko.jp/sample/face/sample1.mp4
    

    上のコマンドがうまく実行できないときは, sample1.mp4 ダウンロードし、C:/image に置いておく

    OTSU の方法による2値化

    import cv2
    import numpy as np
    
    IMROOT="C:/image/"
    v = cv2.VideoCapture(IMROOT + 'sample1.mp4')
    while(v.isOpened()):
        r, f = v.read()
        if ( r == False ):
            break
        mono = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
        r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU)
        cv2.imshow("f", f)
        cv2.imshow("dst", dst)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    v.release()
    cv2.destroyAllWindows()
    

    [image]

    ※ 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

    輪郭抽出

    ここでの輪郭抽出は、2値化の結果を利用して輪郭を抽出している

    import cv2
    import numpy as np
    
    IMROOT="C:/image/"
    v = cv2.VideoCapture(IMROOT + 'sample1.mp4')
    while(v.isOpened()):
        r, f = v.read()
        if ( r == False ):
            break
        mono = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
        r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU)
        contours, hierarchy = cv2.findContours(dst, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        cv2.drawContours(f, contours, -1, (0, 255, 0), 3)
        cv2.imshow("f", f)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    v.release()
    cv2.destroyAllWindows()
    

    [image]

    ※ 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

    OTSU の方法による2値化のあと, 数え上げと画素値の平均

    次のことを行う

    import cv2
    import numpy as np
    
    IMROOT="C:/image/"
    v = cv2.VideoCapture(IMROOT + 'sample1.mp4')
    i = 0
    res = open(IMROOT + 'result.csv', mode='a')
    while(v.isOpened()):
        r, f = v.read()
        if ( r == False ):
            break
        mono = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
        r, dst = cv2.threshold(mono, 0, 255, cv2.THRESH_OTSU)
        lab = cv2.cvtColor(f, cv2.COLOR_BGR2LAB)
        cv2.imshow("f", f)
        cv2.imshow("dst", dst)
        cv2.imshow("L", lab[:,:,0])
        cv2.imshow("A", lab[:,:,1])
        cv2.imshow("B", lab[:,:,2])
        total = np.sum(dst)
        print( "%d, %d, %f, %f, %f" % (i, total, np.sum(lab[:,:,0])/total, np.sum(lab[:,:,1])/total, np.sum(lab[:,:,2])/total ) )
        res.write( "%d, %d, %f, %f, %f\n" % (i, total, np.sum(lab[:,:,0])/total, np.sum(lab[:,:,1])/total, np.sum(lab[:,:,2])/total ) )
        i = i + 1
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    v.release()
    res.close()
    cv2.destroyAllWindows()
    

    ※ 止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

    1列目:フレーム番号、2列目:OTSU の方法による2値化の結果白色となった画素数、3列目:L成分の平均、4列目:a成分の平均、5列目:b成分の平均

    [image]