目的
USBカメラを入力デバイスとして、画像処理を行いたいというニーズは常にあり、これからもその要望はなくならないと思う。実際自分も趣味と仕事の両方で必要な場面があり、メモとして書き留めておこうと思いました。
背景
印象としては、(1)PythonでOpenCVを使う方法が一番簡単、と思ったので、ここにはその方法について書き留めます。通常のデスクトップアプリを作る場合は、(2)Visual StudioでC++を使う、のが商用での配布も含めて便利と思うので、別途記述できればと思います。(3)Raspberry Pi等を使ってPCなしで行う、という手もあります。これについてはこちらをご覧ください。
第一段階
Windows PCにPythonとOpenCVをインストールします。この方法については、様々なサイトでも紹介されているので、ここでは割愛します。
第二段階
PC内蔵カメラを含めたUSBカメラの画像をWindowにてプレビューします。実は、PythonとOpenCVをインストールしたことで、これはいとも簡単にできてしまいます。(実質下記の最初5行のみ)
import cv2 # OpenCVをインポート
imgCapture = cv2.VideoCapture(0) # 0は使いたいUSBカメラの番号
while True: # 無限に繰り返し
ret, img = imgCapture.read() # 画像をimgに読み込んで
cv2.imshow(‘viewer’,img) # ‘viewer’という名前のWindowに表示
if cv2.waitKey(1) & 0xff == ord(‘q’): # ‘q’を押すと終了
break
imgCapture.release()
cv2.destroyAllWindows()
第三段階
次にプレビューしている画像の画素にアクセスします。これもこの環境においては、容易にできます。例えば、アドレス(x,y)のGreenの情報は、img[y,x,1] で読み書きできます。
注意点としては、
(1)y座標、x座標、色指定の順であること
(2)座標は「左下が原点」であること(特にy座標は下から上になるので注意)
(3)色指定はBGRの順であること(0:B、1:G、2:R)
さあ、これだけの情報があれば、やりたいことはできるのではないかと思います。直接imgを触るのは嫌な場合もあるので、その場合は、他の変数にコピーして使いましょう。
imgCopy = img
第四段階
USBカメラの状態も気になると思うので、その参照方法と、画像にテキストを重畳させる方法についても書き留めておきます。
#USBカメラの状態を表示する
import cv2 # OpenCVをインポート
imgCapture = cv2.VideoCapture(0) # 0は使いたいUSBカメラの番号
for num in range(22):
print(n, ‘:’, imgCapture.get(n))
#USBカメラの画像にテキストを重畳させる
#putText(img,text,point,fontFave,fontScale,color,thickness,lineType)
#img:画像オブジェクト
#text:文字列
#point:テキストの左下の座標指定
#fontFace – Font type. One of FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_DUPLEX, FONT_HERSHEY_COMPLEX, FONT_HERSHEY_TRIPLEX, FONT_HERSHEY_COMPLEX_SMALL, FONT_HERSHEY_SCRIPT_SIMPLEX, or FONT_HERSHEY_SCRIPT_COMPLEX, where each of the font ID’s can be combined with FONT_ITALIC to get the slanted letters.
#fontScale:
#color:(b,g,r)のレベルで指定(0-255)
#thckness:フォントの太さ
#lineType:4, 8 , cv2.LINE_AA
import cv2
imgCapture = cv2.VideoCapture(0)
while True:
ret, img = imgCapture.read()
cv2.putText(img,’Overlapped text’, (0,100), cv2.FONT_HERSHEY_SIMPLEX,4,(255,255,0),3,cv2.LINE_AA)
cv2.imshow(‘viewer’,img)
if cv2.waitKey(1) & 0xff == ord(‘q’):
break
imgCapture.release()
cv2.destroyAllWindows()