LoginSignup
0
0

More than 3 years have passed since last update.

Opencvについて②

Posted at

Opencv3系についてのメモ

基本的には公式ドキュメントを確認しながらの物。

前回のメモOpencvについて①

環境・使用画像は前回と同様。

①動画を撮影する

1)cv2.VIdeoCapture(第1引数)

opencv.ipynb
cap = cv2.VideoCapture(0)

第1引数には01を設定する。
USBカメラを使用する場合は数字の入力で使用可能になります。

注意としてはUSBカメラは電源を入れた際に番号が振られる順番が変わる。

ノートPCでカメラ付きの物はたいてい一番最初に認識されるので0で認識できます。

後付けUSBカメラは1と設定すれば認識出来ます。

ただ、過去にあった現象として海外製のUSB3.0接続のカメラをopencvで表示使用としたらNG
メーカー専用のソフトを介して制御しているカメラだったので使えなかった可能性有。

市販の物はたいてい行けるので大丈夫と思います。

公式表記を参考にして

opencv.ipynb
device_id = 0
cap = cv2.VideoCapture(device_id)

cap.set(3,640)
cap.set(4,480)
cap.set(5,50)

while(True):
    ret,frame = cap.read()
  gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
  cv2.imshow("frame",gray)

cap.release()
cv2.destroyAllWindows()

cap.set()については
公式ドキュメントを参照。

正確にはcap.set(第1引数、第2引数)となっており
第1引数:propId
第2引数:値等

スクリーンショット (340).png

リストの上から0、1、2…となっています。
よく使用する物としては
3:CV_CAP_PROP_FRAME_WIDTH 表示画像の横幅指定
4:CV_CAP_PROP_FRAME_HEIGHT 表示画像の縦幅指定
5:CV_CAP_PROP_FPS 表示画像のFPS値指定

cap.set(3,640)は横幅を640にするとなります。

ただ使わなくてもカメラデフォルト設定で表示されるので問題ないと思います。


cap.read()はTrue/Falseの二つの値を返してくる。なんのこっちゃ?

opencv.ipynb
#画像データ有の時
print(ret)
>>>True

#画像データ無の時
print(ret)
>>>False

画像データはframeに格納されている感覚です。

cv2.cvtColor(src, code[, dst[, dstCn]])※公式表記
一見さんお断りの様なの表記って…

細かい使用方法はまだ掴み切れてませんが
cv2.cvtColor(画像、処理方法)でよいかと思ってます。

今回で行くとcv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
frame内の画像データをグレースケール化する認識

cv2.COLOR_BGR2BGRA BGR配列(カラー)
cv2.COLOR_RGB2RGBA RGB配列(カラー)
cv2.COLOR_BGRA2BGR BGR配列(カラー)
cv2.COLOR_RGBA2RGB RGB配列(カラー)

cv2.COLOR_BGR2GRAY BGR配列(グレー変換)
cv2.COLOR_RGB2GRAY RGB配列(グレー変換)

一番左が元画像(動画でなく、画像データを変換しています。)
スクリーンショット (343).png
一番左が元画像((動画でなく、画像データを変換しています。)
スクリーンショット (344).png

画像データから行うといまいち変化は見られないが
VideoCaptureで取得したデータを使うと結構な変化が見られました。
試してみると面白いと思います。

他にも色々とありますが詳しい内容はここを参照。


②動画データを保存する。

opencv.ipynb
device_id = 0
cap = cv2.VideoCapture(device_id)

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)

        # write the flipped frame
        out.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

公式にはこの様な説明となっているがそこまで複雑にする必要はないかと
本当ならこれが一番良いと思いますが
公式より先にシンプルな方法を試していたので正直使った事ないです。


opencv.ipynb
device_id = 0
cap = cv2.VideoCapture(device_id)

while True:
    ret,frame = cap.read()
    cv2.imshow(basename,frame)
    key = cv2.waitKey(1) & 0xFF    
    if key == ord('o'):
        cv2.imwrite("ファイル名",frame)

    elif key == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

cv2.imwrite(第1引数、第2引数)
これを使用して保存が出来ます。
第1引数はファイル名
第2引数はframe

これで問題なく保存は可能です。

第1引数を保存先指定しても行けます。

opencv.ipynb
base_path = "保存先"
base_name = "ファイル名"

cv2.imwrite((base_path + datename + ".png"),frame)

上記の方法で困った事はいまのところなし。


③まとめ

画像を取るだけならこれを組み合わせていけます。

ただ、画像処理との組み合わせなので多岐に渡ると思います。

処理に関しては別途記載していきます。

また、間違っている部分は都度修正していきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0