Anaconda による OpenCV 導入手順（Mac PC）

# 1. はじめに

Mac PC に **Anaconda** をインストールし、
環境を作成して **OpenCV** を導入する手順をまとめます。

また、OpenCV ライブラリを読み込み 画像を表示させる簡単な処理を実行します。

# 2. pyenv 導入

今回は **pyenv**を使用して Anaconda を 導入します。

まずは、以下リンク先の記事 の **[2. Python3 導入] > [2-1. pyenv 導入]** を参考に **pyenv** を導入します。

・Qiita：Mac PC へのPython3 導入手順 > [2. Python3 導入] > [2-1. pyenv 導入] 
https://qiita.com/Haruka-Ogawa/items/b1bf5ad9b28d44702a64#2-1-pyenv-%E5%B0%8E%E5%85%A5


# 3. Anaconda 導入

## 3-1. インストール

第2項で導入した **pyenv** コマンドを使用して、**Anaconda** を導入します。


### ① インストール可能 バージョン 表示

**pyenv**コマンドで インストール可能な **Anaconda** のバージョンを確認します。

コマンドは以下の通りです。

```
pyenv install --list
```

今回は、**anaconda3-2020.11** を導入します。


### ② インストール

**pyenv** コマンドで **anaconda3-2020.11**  をインストールします。

コマンドは以下の通りです。

```
pyenv install anaconda3-2020.11
```

### ③ 確認

**anaconda3-2020.11** のインストールが完了したら、
使用可能なバージョンを表示して、無事導入されていることを確認します。

コマンドは以下の通りです。

```
pyenv versions
```

実行例は以下の通りです。

```
$ pyenv versions
* system (set by /Users/ogawa/.pyenv/version)
anaconda3-2020.11
```

**anaconda3-2020.11** が無事インストールされていることがわかりました。

### ④ PATH設定

ターミナル起動時に Anaconda環境がアクティブになるように
ログインシェルに PATHの設定を追加します。

- **ログインシェル確認**

Mac PCのデフォルトの ログインシェルを確認します。

コマンドは以下の通りです。

```
echo $SHELL
```

実行例は以下の通りです。

```
$ echo $SHELL
/bin/bash
```

ログインシェルが **bash** であることがわかりました。

- **conda init 実行**

**conda init** コマンドを実行します。
シェルには 先ほど確認したMac PCのログインシェル（*bash*）を指定します。

コマンドは以下の通りです。

```
conda init bash
```

ログインシェル(**.bash_profile**)を確認すると、
AnacondaのPATH 設定が追加されていることが確認できます。

- **ログインシェル再実行**

ターミナルを開き直すか、ログインシェル(**.bash_profile**)を実行して、
AnacondaのPATH 設定をします。

コマンドは以下の通りです。

```
source ~/.bash_profile
```

## 3-2. 使用バージョン設定

Anaconda をインストールした後も、使用されているバージョンは Python2.7のままです。

```
$ pyenv version
system (set by /Users/ogawa/.pyenv/version)

$ python -V
Python 2.7.16
```

Python 使用バージョンの変更方法には、
 グローバル（環境全体）で バージョンを変更する方法と、 
ローカル（特定のディレクトリ）で バージョン変更する方法 があります。

バージョンの設定 変更方法については、以下リンク先の記事もご参照ください。

・Qiita：Mac PC へのPython3 導入手順 > [3. Python3 使用設定]
https://qiita.com/Haruka-Ogawa/items/b1bf5ad9b28d44702a64#3-python3-%E4%BD%BF%E7%94%A8%E8%A8%AD%E5%AE%9A


今回は 作業用ディレクトリ(*~/sample*) を作成し、
ローカルで使用バージョンを **anaconda3-2020.11**に変更します。

### ① ディレクトリ作成・移動


作業用ディレクトリ(*~/sample*) を準備し、移動します。

実行例は以下の通りです。

```
$ mkdir ~/sample
$ cd ~/sample
```

### ② バージョン変更

pyenvコマンドで 作業用ディレクトリ(*~/sample*) での使用バージョンを  **anaconda3-2020.11**に変更します。

コマンドは以下の通りです。

```
pyenv local anaconda3-2020.11
```

### ③ 変更後 バージョン確認

バージョンが **anaconda3-2020.11**に変更されており、
Python も バージョン**3.x** が使用されるように なっていることを確認します。

実行例は以下の通りです。

```
$ pyenv version
anaconda3-2020.11 (set by /Users/ogawa/sample/.python-version)

$ python -V
Python 3.8.5
```

## 3-3. 環境作成

Anaconda を導入すると、**conda**コマンドが使用できるようになり、
環境の作成や切り替えを 行うことができるようになります。

ここでは conda環境で環境を作成し、作成した環境に切り替えを行います。

### ① 環境作成

**conda create**コマンドで 環境を作成します。

**-n** (**--name**)オプションで 環境名(*sample37*)、
**python**のバージョンを*3.7*、
パッケージに *anaconda* を指定します。

コマンドは以下の通りです。

```
conda create -n sample37 python=3.7 anaconda
```

・Conda Docs：Command reference > conda create
https://docs.conda.io/projects/conda/en/latest/commands/create.html


### ② 確認

**conda info**コマンドで、環境(*sample37*)が作成されたことを確認します。

コマンドは以下の通りです。

```
conda info --envs
```

・Conda Docs：Command reference > conda info
https://docs.conda.io/projects/conda/en/latest/commands/info.html#


実行例は以下の通りです。

```
$ conda info --envs
# conda environments:
#
base                  *  /Users/ogawa/.pyenv/versions/anaconda3-2020.11
sample37                 /Users/ogawa/.pyenv/versions/anaconda3-2020.11/envs/sample37
```

環境(*sample37*)が作成されたことがわかりました。

### ③ 環境切り替え

**conda activate** コマンドで 作成した環境(*sample37*) を有効化し、
環境を切り替えます。

コマンドは以下の通りです。

```
conda activate sample37
```

・Conda Docs：Command reference
https://docs.conda.io/projects/conda/en/latest/commands.html#conda-general-commands


# 4. OpenCV 導入

第３項 で作成した環境で **OpenCV**を使用できるように **opencv**パッケージを導入します。

- **インストール**

**conda install**コマンドで *opencv* パッケージを追加します。
 
コマンドは以下の通りです。

```
conda install -c menpo opencv
```

・Conda Docs：Command reference > conda install
https://docs.conda.io/projects/conda/en/latest/commands/install.html


- **確認**

**import cv2** を実行して、opencv が読み込めることを確認し、
読み込まれた opencvのバージョンを確認します。

実行例は以下の通りです。

```
$ python
Python 3.7.9 (default, Aug 31 2020, 07:22:35) 
[Clang 10.0.0 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.4.2'
```

OpenCV のバージョン *3.4.2* が読み込まれていることがわかりました。


## 補足

**conda create** コマンドで **Python = 3.8** を指定して環境を作成した場合、
**conda install -c menpo opencv**では OpenCVをインストールすることができません。

```
$ conda install -c menpo opencv
Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: - 
Found conflicts! Looking for incompatible packages.
This can take several minutes.  Press CTRL-C to abort.
failed                                                                          

UnsatisfiableError: The following specifications were found
to be incompatible with the existing python installation in your environment:

Specifications:

  - opencv -> python[version='2.7.*|>=3.6,<3.7.0a0|>=3.5,<3.6.0a0|>=3.7,<3.8.0a0|>=2.7,<2.8.0a0']

Your python: python=3.8

If python is on the left-most side of the chain, that's the version you've asked for.
When python appears to the right, that indicates that the thing on the left is somehow
not available for the python version you are constrained to. Note that conda will not
change your python version to a different minor version unless you explicitly specify
that.
```

Python 3.8で環境を作成した場合は、
**pip install** コマンドで **opencv-python** をインストールするか、
menpoチャンネルではなく **conda-forge**チャンネルから opencv のパッケージをインストールします。

コマンドは それぞれ以下の通りです。

- **pip install** を使う場合

```
pip install opencv-python
```

- **conda-forge** チャンネルを使う場合

```
conda install -c conda-forge opencv
```

# 5. 動作確認

動作確認として、OpenCV を使って 簡単な処理を実行します。

ここでは**Jupyter Notebook**を開いて、ノートブックを作成し、
そこでOpenCVを読み込んで 指定した画像を表示する処理を記述します。

## 5-1. Jupyter Notebook 起動

### ① 起動

前項で作成した環境を 有効化・切り替えた上で、
**jupyter notebook** コマンドを実行し Jupyter Notebook を起動します。

```
jupyter notebook
```

以下のような画面が 開きます。

![スクリーンショット 2021-03-23 22.04.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/25e63f6b-8b7d-4afb-aa69-cffcede7a3dd.png)

### ② ノートブック作成

Jupyter Notebookではノートブック上で処理を記述し、
[Run]ボタンをクリックすると 処理を実行することができます。


まず、画面右上の **[新規]** > **[Python3]** をクリックし、ノートブックを開きます。

![スクリーンショット 2021-03-23 22.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/132b22dc-8fc1-4791-6c68-94f456e4cbfe.png)

以下のような画面が開き、
処理は真ん中の枠に記述していきます。

![スクリーンショット 2021-03-23 22.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/3c114e34-cf15-bed0-0ef4-7dfa719bd09b.png)


## 5-2. 画像表示

Jupyter Notebook で開いたノートブックに、画像表示させる 処理を記述し、実行します。

### ① 画像準備

表示させる画像を用意します。

今回は以下のような 画像（*fireworks.JPG*) を表示させます。

![fireworks.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/eca65f7c-b416-5788-c0da-c05a544b51ec.jpeg)

画像は **~/sample/image/**ディレクトリに配置しておきます。

![スクリーンショット 2021-03-23 22.24.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/e8536c0f-2fce-883b-8f0e-4e703ba4d3b3.png)


### ② opencv 読み込み

以下を実行して、**OpenCV**を読み込みます。

```
import cv2
```

![スクリーンショット 2021-03-23 22.21.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/07e9525e-d2e1-c00f-cddf-2bbc5da84d5d.png)


### ③ 画像読み込み

以下を実行して、準備した画像(*image/fireworks.JPG*)を読み込みます。

```
image = cv2.imread("image/fireworks.JPG")
```

![スクリーンショット 2021-03-23 23.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/acddec85-9a45-50ad-6e4b-b1adef61be94.png)


### ④ 画像表示

以下を実行して、画像(*image*)をウィンドウに表示させます。

```
cv2.imshow('sample', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```

![スクリーンショット 2021-03-23 23.08.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/c3e1a2c9-aa9b-2333-5eb6-b668d142f8b7.png)


実行すると、以下のような画面が開き、画像が表示されます。

![スクリーンショット 2021-03-23 22.33.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/f58207c8-9c6a-add4-0857-b85d549abee4.png)

キーイベントが発生すると、画像は閉じられます。


使用した関数について説明します。

- **imshow関数**

**imshow**関数で ウィンドウ名(*sample*)と 画像(*image*)を指定し、画像を表示します。

```
imshow('<ウィンドウ名>', <画像>)
```

- **waitKey関数**

**waitKey**関数で キーイベントが発生するまで 次の処理(ウィンドウを閉じる)を待機するようにします。

この関数では ミリ秒単位でキーイベントの待機時間を設定します。
*0*を指定すると、無限にキーイベントを待機します。

```
waitKey(<キーイベント待機時間>)
```

- **destroyAllWindows関数**

**destroyAllWindows**関数で、すべての表示ウィンドウを閉じます。

```
destroyAllWindows()
```




・OpenCV 3.4.2 
https://docs.opencv.org/3.4.2/d7/dfc/group__highgui.html

# 6. おわりに

今回は Anaconda で 環境を作成し、OpenCVを導入しました。

Anaconda の扱いは 慣れるまでが大変ですが、
手軽に環境を作成し、必要なモジュールを入れて 環境を切り替えながら使用できるので、
複数環境を使い分けたい時に便利だと思いました。


# 参考情報

・Conda Docs
https://docs.conda.io/projects/conda/en/latest/index.html

・conda-forge：Docs
https://conda-forge.org/docs/index.html#


・OpenCV 3.4.2 
https://docs.opencv.org/3.4.2/d7/dfc/group__highgui.html