RasPi:OpenCVで遊んでみた♬

今回は、RasPiにOpenCVをインストールして遊んでみた話です。

インストールは、Ubuntu on Windowsでは、最後最後

```
QXcbConnection: Could not connect to display :0
Aborted (core dumped)
```
が出て、どうにも後味悪い状況でした。

しかし、その他の環境では一応使えているので、RasPiも動くといいなぁ～
手順は、ほとんど変わりません。
前回、ほぼ出来たので以下のサイトのまんま入れます。
【参考】
１．[Ubuntu OpenCVをインストールする手順](https://www.trifields.jp/how-to-install-opencv-on-ubuntu-2742)
２．前回の記事[OpenCVで遊んでみた♬](https://qiita.com/MuAuan/items/5d968d41e993848a4332)

ここで問題になりそうなのが、
-D WITH_FFMPEG=ON \
ですが、今回はあくまで最小構成（つまり参考1）で、動かしてから考えることにします。

ということで、RasPiでは特に問題なしで最後まで表示できました。
そして、FFMPEGのインストール。。。
いろいろ参照して試みましたが、失敗しています。

ということで、出力した動画ファイルGRAY_FILE_NAME='douga_camera_5s.avi'
の表示ができませんでした。
これは、Windowsにファイルを移動して確認できました。
また、以下のコードでWindowsのときは問題なく、mp4出力もできましたが、これもエラーはいています。なんでだろ？？
*前記事の以下の部分ができません*

```
【追記】cv_fourcc('M', 'P', '4', 'V')、
 　　　　ファイル名：OUT_FILE_NAME = "real_SSD_result.mp4"で動きました。
 　　ファイルサイズちょっと減少：9,420(avi)⇒9,387KB(mp4)
```
エラー

```
[mp4 @ 0x184e660] Tag MP4V/0x5634504d incompatible with output codec id '13'
```
.mp4がcodec idと不整合だと。。。なんだろ？？ 
ちょっと調べたくらいでは解決しないので、気長に待つこととしよう。。

まあ、.aviで保存できているし、動画も見られるので一応目標としては達成している。

###実行中のRasPi画面
こんな感じです。。。
![gdIbc1Mx.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/ef663bba-d629-46e2-aa34-00df2934629b.jpeg)
![52EuIvE5.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/c4c8209a-93e9-eafa-c9bd-55d7c233a435.jpeg)

*ここまできたら、物体検出まで行きたい。。。*
*さっきのMJPG-Streamerみたいに配信や監視がしたい。。。*

###コードは以下の通り
python2.7のidleで動かしています。
[コード的には、以前のものと全く同じです。](https://github.com/MuAuan/OpenCV/blob/master/read_save_doga.py)

```read_save_doga.py
import numpy as np
import cv2

# cv2.cv.CV_FOURCC
def cv_fourcc(c1, c2, c3, c4):
    return (ord(c1) & 255) + ((ord(c2) & 255) << 8) + \
        ((ord(c3) & 255) << 16) + ((ord(c4) & 255) << 24)

cap = cv2.VideoCapture(0) #'dougasozai_car.mp4')
GRAY_FILE_NAME='douga_camera_5s.avi'
FRAME_RATE=30
ret, frame = cap.read()

# Define the codec and create VideoWriter object
height, width, channels = frame.shape
out = cv2.VideoWriter(GRAY_FILE_NAME, \
                      cv_fourcc('X', 'V', 'I', 'D'), \
                      FRAME_RATE, \
                      (width, height), \
                      True)  #isColor=True for color
"""
out = cv2.VideoWriter(GRAY_FILE_NAME, \
                      cv_fourcc('X', 'V', 'I', 'D'), \
                      FRAME_RATE, \
                      (width, height), \
                      False)  ##isColor=False for gray
"""
# ウィンドウの準備（無くても余り変わらない）
cv2.namedWindow('frame')
cv2.namedWindow('gray')
cv2.namedWindow('hsv')
cv2.namedWindow('mask')
cv2.namedWindow('res')
cv2.namedWindow('gaussian')

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

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    hsv =cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    hsv =cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    # ガウシアン平滑化
    # (5, 5)はｘ、ｙ方向の標準偏差で変えるとボケ度が変わる、最後の引数はint,ボーダータイプらしいが数字の意味不明    
    g_frame = cv2.GaussianBlur(frame, (15, 15), 0)
    gg_frame = cv2.cvtColor(g_frame, cv2.COLOR_BGR2GRAY)

    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    
    # Threshold the HSV image to get only blue colors
    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    # Bitwise-AND： mask and original image
    res = cv2.bitwise_and(frame,frame, mask= mask)

    cv2.imshow('frame',frame)
    cv2.imshow('gray',gray)
    cv2.imshow('hsv',hsv)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    cv2.imshow('gaussian',g_frame)

    
    #書込みgrayならグレー画像、frameなら拡張子変更
    #カラーなら、out = cv2.VideoWriter()でisColor=True、グレーならFalse
    #out.write(gray)  #OK by cv2.VideoWriter_fourcc(*'XVID') #NG by cv_fourcc('X', 'V', 'I', 'D')
    #out.write(res)    #OK by cv_fourcc('X', 'V', 'I', 'D')
    #out.write(mask)  #OK by cv2.VideoWriter_fourcc(*'XVID') #NG by cv_fourcc('X', 'V', 'I', 'D')
    #out.write(hsv)    #OK by cv_fourcc('X', 'V', 'I', 'D')
    #out.write(frame)    #OK by cv_fourcc('X', 'V', 'I', 'D')
    out.write(g_frame)  #OK by cv_fourcc('X', 'V', 'I', 'D')
    #out.write(gg_frame)  #OK by cv2.VideoWriter_fourcc(*'XVID') #NG by cv_fourcc('X', 'V', 'I', 'D')
    
    #なんかKey押せば止まる
    if cv2.waitKey(1000*5) >= 0:  
        break
        
    ret, frame = cap.read()

cap.release()
out.release()
cv2.destroyAllWindows()
```