Jetson Nano に Raspberry Pi用 カメラをつけて写真を撮ってみる

# TL;DR
Jetson Nanoにラズパイのカメラをつけて、動画(写真)が撮れることを確認します


# 事前準備
## Jetson NanoにOpenCVを入れます。
入れ方はいろいろありますが、私の方法だと[こちら](https://qiita.com/asahi0301/items/3c287190348552f19415)

## Jetson Nanoにカメラを取り付けます
私は[こちら](http://denor.daa.jp/jetson-nano%E9%96%8B%E7%99%BA%E8%80%85%E3%82%AD%E3%83%83%E3%83%88%E3%81%ABraspberry-pi%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-v2%E3%82%92%E6%8E%A5%E7%B6%9A)を参考にしました。同じカメラを買って取り付けています

# 写真を撮ってみる
## スクリプトの中身
環境はpython3です


```camera-to-img.py

import os
import cv2

GST_STR = 'nvarguscamerasrc \
        ! video/x-raw(memory:NVMM), width=3280, height=2464, format=(string)NV12, framerate=(fraction)30/1 \
        ! nvvidconv ! video/x-raw, width=(int)1920, height=(int)1080, format=(string)BGRx \
        ! videoconvert \
        ! appsink'

dir_path = 'images'
base_path = 'images/pic'
ext = 'jpg'

def main():
    cap = cv2.VideoCapture(GST_STR, cv2.CAP_GSTREAMER)

    os.makedirs(dir_path, exist_ok=True)

    n = 0
    while True:
        ret, frame = cap.read()
        cv2.imwrite('{}_{}.{}'.format(base_path, n, ext), frame)
        n += 1

if __name__ == "__main__":
    main()
```


## スクリプトの実行

```sh

python3 camera-to-img.py

GST_ARGUS: Creating output stream
CONSUMER: Waiting until producer is connected...
GST_ARGUS: Available Sensor modes :
GST_ARGUS: 3280 x 2464 FR = 21.000000 fps Duration = 47619048 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 3280 x 1848 FR = 28.000001 fps Duration = 35714284 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 1920 x 1080 FR = 29.999999 fps Duration = 33333334 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 1280 x 720 FR = 59.999999 fps Duration = 16666667 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 1280 x 720 FR = 120.000005 fps Duration = 8333333 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000;

GST_ARGUS: Running with following settings:
   Camera index = 0 
   Camera mode  = 0 
   Output Stream W = 3280 H = 2464 
   seconds to Run    = 0 
   Frame Rate = 21.000000 
GST_ARGUS: PowerService: requested_clock_Hz=53037600
GST_ARGUS: Setup Complete, Starting captures for 0 seconds
GST_ARGUS: Starting repeat capture requests.
CONSUMER: Producer has connected; continuing.
```

10秒後くらいに Ctrl + C でスクリプトを止めて、カレントディレクトリにできた「images」ディレクトリの中にjpegファイルがたくさんできていると思います。

```sh

ls
pic_0.jpg   pic_13.jpg  pic_17.jpg  pic_20.jpg  pic_24.jpg  pic_28.jpg  pic_31.jpg  pic_35.jpg  pic_3.jpg  pic_7.jpg
pic_10.jpg  pic_14.jpg  pic_18.jpg  pic_21.jpg  pic_25.jpg  pic_29.jpg  pic_32.jpg  pic_36.jpg  pic_4.jpg  pic_8.jpg
pic_11.jpg  pic_15.jpg  pic_19.jpg  pic_22.jpg  pic_26.jpg  pic_2.jpg   pic_33.jpg  pic_37.jpg  pic_5.jpg  pic_9.jpg
pic_12.jpg  pic_16.jpg  pic_1.jpg   pic_23.jpg  pic_27.jpg  pic_30.jpg  pic_34.jpg  pic_38.jpg  pic_6.jpg
```

そのうち一枚を見てみると、こんな感じで写真が撮れていることが分かります。
変なアングルですいません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107953/6ea4514d-5a31-ad9e-de3f-3f6be76b12b6.png)


# トラブルシューティング

こんな感じで video としてカメラは登録されているのですが、

```
v4l2-ctl -d /dev/video0 --list-formats
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'RG10'
        Name        : 10-bit Bayer RGRG/GBGB
```


opencvのサンプルスクリプトでよく見られる

```
cv2.VideoCapture(0)
```

とやってもカメラに接続することができず、スクリプトのようにすることでopencvからようやくカメラに接続できました。