金子邦彦研究室人工知能OpenCV 4 の Python プログラムOpenCV でビデオカメラ画像の表示,ファイル書き出し,濃淡画像処理(Python を使用)

OpenCV でビデオカメラ画像の表示,ファイル書き出し,濃淡画像処理(Python を使用)

目次

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

【OpenCV の公式情報】

前準備

Python の準備(Windows,Ubuntu 上)

サイト内の関連ページ

関連する外部ページ

Python の公式ページ: https://www.python.org/

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

OpenCV Python のインストール

Python で OpenCV を動かすためのもの.

OpenCV Python のインストールは:別ページ »で説明1~2 コマンドの実行でインストールできる.

カメラ画像の表示

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

Python プログラムの実行

Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.

Python のまとめ: 別ページ »にまとめ

import cv2
import numpy as np

v = cv2.VideoCapture(0)
while(v.isOpened()):
    r, f = v.read()
    if ( r == False ):
        break
    cv2.imshow("", f)
    # Press Q to exit
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

v.release()
cv2.destroyAllWindows()

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

表示サイズを変える

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

224, 224」のところが表示サイズである.

import cv2
import numpy as np

v = cv2.VideoCapture(0)
while(v.isOpened()):
    r, f = v.read()
    if ( r == False ):
        break
    img = cv2.resize(f, (224, 224))
    cv2.imshow("", img)
    # Press Q to exit
    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)
    # Press Q to exit
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

v.release()
cv2.destroyAllWindows()

[image]

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

動画ファイルの書き出し

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

Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える.
import os
import numpy as np
import cv2
IMROOT=os.environ['LOCALAPPDATA'] + '/'
v = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
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)   
    # Press Q to exit
    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)
    # Press Q to exit
    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)
    # Press Q to exit
    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)
    # Press Q to exit
    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値化

Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える.
import os
import numpy as np
import cv2
IMROOT=os.environ['LOCALAPPDATA'] + '/'

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)
    # Press Q to exit
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

v.release()
cv2.destroyAllWindows()

[image]

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

輪郭抽出

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

Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える.
import os
import numpy as np
import cv2
IMROOT=os.environ['LOCALAPPDATA'] + '/'

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)
    # Press Q to exit
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

v.release()
cv2.destroyAllWindows()

[image]

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

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

次のことを行う

Ubuntu, RaspberryPi のときは,「IMROOT=os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT="/usr/local/image/"」のように書き換える.
import os
import numpy as np
import cv2
IMROOT=os.environ['LOCALAPPDATA'] + '/'

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
    # Press Q to exit
    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]