VS CodeとDocker ComposeでJupyterを使ってOpenCVで画像処理する開発環境を作った件

#目的
Pythonで画像処理がしたくて開発環境を作ろうと思った次第です。
「Docker-composeでJupyter」又は「Docker-composeでOpenCV」を単体でやってる方は多かったけど、同時にやってるのが見つからなかったのと意外と時間かかったので自分用のメモ。
composeにしたのは毎回コマンド打つのが面倒だった。　←　知識の浅さを露呈？
ついでにVS CodeでJupyterを使う。

[一応Githubに置いておきます。](https://github.com/the1031hiroto/docker_jupyter)
#Dockerfileとdocker-compose.yml
[Docker-composeでJupyterLabを簡単構築](https://qiita.com/tsnb/items/4893bc46bbdff4f97dfb)を参考に（まるマパクり）させてもらってdocker-compose.ymlを追加する。
そのままだとJupyterのimageしか使えないのでDockerfileに移す。

```docker-compose.yml
version: '3'
services:
  jupyterlab:
    # これだとJupyterのimageしか使えないのでDockerfileに移す
    # image: jupyter/datascience-notebook:latest
    build: .
    user: root
    environment:
      NB_UID: 1000
      NB_GID: 100
      GRANT_SUDO: "yes"
    volumes:
       - "./work:/home/jovyan"
    privileged: true
    ports:
      - "8888:8888"
    restart: unless-stopped
    command: start.sh jupyter lab --NotebookApp.token=''

```
Dockerhubから[jjanzic/docker-python3-opencv](https://hub.docker.com/r/jjanzic/docker-python3-opencv/)のimageを使う。
[jupyter-docker](https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html)から使いたいimageをもってくる。

```Dockerfile:Dockerfile
FROM python:3.7

ARG project_dir=/home/jovyan
WORKDIR $project_dir

FROM jjanzic/docker-python3-opencv

# https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html
FROM jupyter/scipy-notebook:latest

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

```
あとはdocker-compose build & upでいける。
ちなみに、下記にしたかったがこれだとうまく立ち上がらない。。。
誰か理由を教えてください。。。

```Dockerfile:Dockerfile(NG)
FROM python:3.7
FROM jupyter/scipy-notebook:latest

ARG project_dir=/home/jovyan
WORKDIR $project_dir

# 他に必要なものを入れる
FROM jjanzic/docker-python3-opencv
RUN pip install opencv-python

```
#JupyterをVS Codeで使う
Jupyterをブラウザで使う分にはこのままで問題ないが、せっかくならVS Codeで[Jupyter](https://marketplace.visualstudio.com/items?itemName=donjayamanne.jupyter)を使いたい。
VS Codeはローカルを参照しているので、拡張機能[Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)を使ってDockerに入る。
使い方は[こちら](https://tech.actindi.net/2019/06/18/085723)の方が分かり易くまとめてくれてるので参考にしてDockerを立ち上げる。

VSCodeの左下角をクリックして、Remote-Containers: Open Folder in Containerを選択して、docker-compose.ymlのあるプロジェクトのルートディレクトリを選択しすると立ち上がる
<img width="1396" alt="スクリーンショット 2019-08-16 10.52.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/467d787e-9110-513b-b94b-ce2749a762d3.png">


普段使っている拡張機能が反映されないので.devcontainer.jsonのextensionsに追加する。

```json:.devcontainer.json
// See https://aka.ms/vscode-remote/devcontainer.json for format details or
// https://aka.ms/vscode-dev-containers/definitions for sample configurations.
{
	"dockerComposeFile": "docker-compose.yml",
	"service": "jupyterlab",
	"workspaceFolder": "/",
	"extensions": [
		"ms-python.python",
		"donjayamanne.jupyter",
		"formulahendry.auto-close-tag",
		"formulahendry.auto-rename-tag",
		"coenraads.bracket-pair-colorizer",
		"dbaeumer.vscode-eslint",
		"msjsdiag.debugger-for-chrome",
		"ms-azuretools.vscode-docker",
		"donjayamanne.githistory",
		"huizhou.githd",
		"eamodio.gitlens",
		"oderwat.indent-rainbow",
		"ms-ceintl.vscode-language-pack-ja",
		"ibm.output-colorizer",
		"ryu1kn.partial-diff",
		"ionutvmi.path-autocomplete",
		"esbenp.prettier-vscode",
		"wallabyjs.quokka-vscode",
		"mechatroner.rainbow-csv",
		"ms-vscode-remote.remote-containers",
		"humao.rest-client",
		"shan.code-settings-sync",
		"shardulm94.trailing-spaces",
		"octref.vetur",
		"vscode-icons-team.vscode-icons",
		"wakatime.vscode-wakatime"
	]
}
```
ちなみに、ここに書くのは拡張機能の名前の右側にあるやつを追加する。
一発でJsonに吐き出す方法が分からなかったので地道に追加した。
<img width="1022" alt="スクリーンショット 2019-08-14 16.14.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/fd544517-60a0-8dcf-9560-c591c7adce1e.png">

#JupyterをVS Codeで使えた
ちなみに、[Jupyter](https://marketplace.visualstudio.com/items?itemName=donjayamanne.jupyter)を入れると、"#%%"の上に"Run Cell"が出てくるのでクリックすると実行画面が表示される。
<img width="1440" alt="スクリーンショット 2019-08-16 10.15.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/711638c1-cb67-6631-ff8e-04152330a888.png">
# OpenCVを使ってみる
## 画像から文字の輪郭を抽出する
出力画像は左から、元画像・２値化・元画像の文字輪郭・２値化画像の文字輪郭
<img width="1440" alt="スクリーンショット 2019-11-04 16.38.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/092a2100-5bf2-8d55-20c3-ac7a5d535b20.png">