Opencvについて②

Opencv3系についてのメモ

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

前回のメモ[Opencvについて①](https://qiita.com/bobrock/items/d410db7ac71908eb2ecf)

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

###①動画を撮影する

1)cv2.VIdeoCapture(第1引数)

```python:opencv.ipynb
cap = cv2.VideoCapture(0)
```
第1引数には`0`や`1`を設定する。
USBカメラを使用する場合は数字の入力で使用可能になります。

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

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

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

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

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

公式表記を参考にして

```python: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()`については
[公式ドキュメント](https://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture-get)を参照。

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

![スクリーンショット (340).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/526b1a5b-48ef-89bc-8353-3266011f8630.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の二つの値を返してくる。なんのこっちゃ？

```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/14e596a8-4fd7-bd86-d133-1178f149b62b.png)
一番左が元画像((動画でなく、画像データを変換しています。)
![スクリーンショット (344).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/88167c72-1d24-155e-4cff-329cdfd5a68e.png)

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

他にも色々とありますが詳しい内容は[ここを参照。](https://docs.opencv.org/3.4.12/d8/d01/group__imgproc__color__conversions.html#ga397ae87e1288a81d2363b61574eb8cab)

---
###②動画データを保存する。
```python: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()

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

---
```python: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引数を保存先指定しても行けます。

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

cv2.imwrite((base_path + datename + ".png"),frame)
```
上記の方法で困った事はいまのところなし。

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

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

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

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