Webカメラの画像処理

Python Open CVの利用

パソコン内蔵のカメラや外付けUSBカメラの画像を処理するプログラムは自作できないものかとWEBを調べてみたら,Python版OpenCVを使って簡単に作れることが分かった.OpenCV (Open Source Computer Vision Library) はインテルが開発,公開した有名な画像処理ライブラリで.Python,C/C++,Java言語等で利用可能である.

今回は取り込んだ画像を,カラー,グレー,線画(輪郭)で表示することを試みた.プログラムの雛形およびその使用例は公開されているので,基本プログラムのパラメーターを自分の環境に合うように変更して実行したが,肝心の import cv2でつまずき,cv2モジュールを認識させるのにかなり手間取った.結果的には,PATHが通っていなかったのが原因であった.同様の経験をされた先人の報告(資料2)を参考にして解決することができた.

ELECOM UCAM-DLK130TBK

130万画素,カメラ部は3.5cm角,4隅にLED照明付き.ドライバのインストールなしで使用可能. ガラスレンズ

Logicool C270m

最大解像度: 120万画素,720p/30fps .同じプログラムでは認識しない.検討の結果,cv2.namedWindowの記述が必要であることが判った.

プログラム

import cv2 # 画像処理ライブラリをインポート


cam = cv2.VideoCapture(0) # カメラキャプチャ, 括弧内の 0 はカメラのデバイス番号


cv2.namedWindow("webcam", cv2.WINDOW_NORMAL) # 🔴 Logicool C270mの場合は必須(ウィンドウのサイズを変更可能にする) 🔴重要

# cv2.WINDOW_AUTOSIZE:デフォルト。ウィンドウ固定表示

while True: # ESCキーが押されない限り, ライブ画像を取り込みを繰り返す

ret, camimg = cam.read() # 画像を取得, retは脚注参照

camimg = cv2.resize(camimg, (480,360)) # リサイズ(縮小)

cv2.imshow('USB Camers Color', camimg) #カラー画像を表示


grey = cv2.cvtColor(camimg, cv2.COLOR_BGR2GRAY) #グレイ画像変換

cv2.imshow('USB Camers Grey', grey) #グレイ画像を表示


edges = cv2.Canny(camimg,100,200) #輪郭抽出 🔴2つの閾値(最大閾値・最小閾値)を調整

edges = cv2.bitwise_not(edges) #反転

cv2.imshow('USB Camers Edges',edges) #線画表示


if cv2.waitKey(1) == 27: # ESCキーで終了

break

cam.release() # カメラキャプチャ解放

cv2.destroyAllWindows() # CV2ウインドウのすべてを閉じる

各モードのライブ画像が重なって表示されるので,ずらして見る必要がある.下図はそれぞれの動画の1コマである.Core i5 CPUでは処理が追いつかないのではと思ったが,テレビ画像をUSBカメラを通して問題なく見ることができる.

線画を得るには輪郭抽出した後,白黒を反転させる必要がある.次図で理解してほしい.

線画の場合, edges = cv2.Canny(camimg,100,200) (上図)を edges = cv2.Canny(camimg,60,120) に変更した場合,全体にノイズが増えるようである. いろいろな条件で試す必要があるようだ.

Canny法の閾値について

次図の例では,保存された画像データを cv2.imread('ファイル名.jpg' ,0) で読み取り処理したものである.cv2.imread ('ファイル名.jpg' ,0) のファイル名の後のゼロはグレイスケールで読むことを意味している.100, 200では額,頬のテカリを輪郭として拾っている.

#coding: utf-8

import cv2

grey = cv2.imread('satocyan.jpg',0) #Gray Scaleで画像を読込

edges = cv2.Canny(grey,140,200) #Canny方式でエッジ検出 🔴2つの閾値(最大閾値・最小閾値)

cv2.imshow('edges',edges) #結果表示

cv2.waitKey(0)

cv2.destroyAllWindows()

cv2.Canny(camimg,100,200)の場合

cv2.Canny(camimg,120,200)の場合

cv2.Canny(camimg,140,200)の場合

ライブ画像を送出するには,膨大な単純作業を一瞬にして処理する必要があるが,家庭用パソコンはそれを可能にするまでに発達したと言えそうである.単純作業の内容については資料2で説明した.グレイ画像の場合,横480,縦360の点の濃淡を256階調で表現するだけである が,それを1秒間に数十回実行していることになる.

一昔前まではネット回線が遅かったこともあり,スカイプ用には,30 万画素程度の外付けWebカメラを使用していたが,最近は120 画素が普通になっている.OpenCVを利用すると,安価なWebカメラを使用した動体検知や顔認証などのプログラムが簡単に作る可能性があることがわかった.

資料

1)画像を扱う — OpenCV-Python Tutorials 1 documentation

2)macのpython3系にopencv3をインストールする

3)Canny Edge Detection

4)"Ret" will obtain return value from getting the camera frame, either true of false. すなわち,retは画像取得の戻り値を示すフラグ.

5)画像を拡大すると色を表す数値が現れる.グレースケール画像の場合は256階調のスケール,0は黒,255は白である.

カラーの場合は,一個のマスに3個の数値,すなわちRGB三原色の各値が表示されている.

グレーは2次元の配列,カラーの場合は配列の各要素に3個の値が格納されているということになる.