未経験大学生によるpython入門日誌-第4話 OpenCV篇

序文

片山です。

先日、西新宿5丁目駅と新宿駅で猛ダッシュしてまで乗った終電で、あろうことか寝過ごして海老名まで行ってしまいました。
当然電車はなかったので藤沢市まで歩くことにしました。

ebina

海老名の農道が思った以上に暗くてビビったので、たまたま通りかかったお兄さんに話しかけたら車で家まで送ってくれました。

今回こそはとRailsに挑戦する記事を書いている途中で

slack

とのご指摘を受けましたので急遽python記事の続きを書くことにしました。ネタがないのでOpenCVにチャレンジしてみます。

本文

OpenCV導入編

python3とかHomebrewは入っているのでさっさと進めていきます。

numpyをいれる

$ brew install numpy --with-python3

ちゃっちゃとopencvを入れる

なんとなく新しそうという理由でOpenCV3を導入します。

$ brew install opencv3 --with-python3
$ brew link opencv3 --force

とここでエラー。「opencvをunlinkしてからやれアホ」って感じに怒られたので

$ brew unlink opencv

します。以前OpenCVを入れようとしたことがあったのを完全に忘れていました。
再度linkしてあげて完了です。

陰の声:
opencv3をインストールする前にbrew tap homebrew/scienceが必要ですヨ

状況によってはopencv3をlinkする前にbrew link cmakeecho 'export PATH="/usr/local/opt/opencv3/bin:$PATH"' >> ~/.bash_profileの実行が必要かも

チェック

やっとこさOpenCV3が入ったので早速インポート出来るか試してみます。

$ python3
>>> import cv3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'cv3'

ん?まさかな?と思い調べた所、cv2でインポートするっぽいです。普通cv3ってやりたくなりませんかね。

>>> import cv2
>>> cv2.__version__
'3.2.0'

OpenCV3なのにcv2でインポートするなんて知りませんがな、と心のなかで思いつつとりあえず導入はできました。

陰の声:
私だけかもしれませんが、cv2をimportする前に以下を行わないとライブラリのパスを認識できませんでした
import sys
sys.path.append('/usr/local/opt/opencv3/lib/python3.6/site-packages')
該当する方は以下のコードでもimport cv2の前に上の2つを追加してください

OpenCV使用篇

実際どう使うかはよくわからなかったので参考サイトを探しました。
こちらのサイトのサンプルをとりあえず動かしてみます。英語なのでよくわかりません。

widthとheightを取得してコンソールに表示するところは自分で追加しました。
デフォルトではwidth:1280 height:720とのことでした。
参考元のサイトでは”For example, I can check the frame width and height by cap.get(3) and cap.get(4). It gives me 640×480 by default.”と言っているのですが載せてるカメラによって違うんでしょうか?

opencv.py

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

print('width:' + str(cap.get(3))) # width
print('height:' + str(cap.get(4))) # height

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

自撮りしてみました。

opencv

手のひらを写したので誰か手相鑑定して下さい。

表示するウィンドウのwidthとheightの大きさを変える

デフォルトのまま変えられないとなんか嫌ですね。参考サイトの言うとおりに書いてみました。
仕組みはよくわかりませんがちゃんと変わります。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

print('default width:' + str(cap.get(3))) # default width
print('default height:' + str(cap.get(4))) # default height

ret = cap.set(3, 320) # set width
ret = cap.set(4, 240) # set height

print('modified width:' + str(cap.get(3))) # modified width
print('modified height:' + str(cap.get(4))) # modified height

while(True):
    # capture frame-by-frame
    ret, frame = cap.read()

    # our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # display the resulting frame
    cv2.imshow('frame', gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

結び

お腹が減ったので今回はここまでにします。

関連記事

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

Yuki.K

1995年生まれ。慶應大学SFCに在学中。
夢も希望もなくキャンパスを彷徨っていたところ、夢と希望いっぱいのBPS村に引きずり込まれてしまった大学生アルバイト。
雑用担当

Yuki.Kの書いた記事

開発
LinuxでTidalCyclesを動かす

2017年10月03日

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ