macOSにPython3系の環境を構築する方法はいくつかあります。

  1. macOS用パッケージマネージャーのHomebrewを利用して、Python3とOpenCV3までHomebrewのみで構築する方法
  2. Homebrewでpyenv/virtualenvをインストール(pip install)してから、pyenvとvirtualenvを使い、Macのシステムから分離して構築する方法
  3. Anaconda3をMacにインストールして独自のPython環境を構築する方法(Macのシステムと共存)

僕は3にしています。

この記事では3の環境でOpenCVとPyOpenGLを使えるようにするまでをまとめます。いまいち「?」なところもあるけれど、ひとまず動かせるようになりました。

Anaconda?pyenv?どれがいいの?

本題に入る前にとても興味深い記事がありました。

参考:Anaconda は Environment Isolation Tool (環境分離ツール) ではない – Qiita

どの選択がベストか、それは人によって違うでしょうね。

Python2系と3系で同時に開発している方はpyenvを使うかもしれませんし、必要なライブラリだけでいいと考えている人もいるでしょう。pyenvとAnacondaを組み合わせることが合っているならそちらを使う、というふうに。

僕は色々と揃っているAnacondaにしました。しかし、OpenCVやOpenGL関連の設定がPythonのバージョンが違うだとか依存関係だとかよくわからなくなったので(前回の記事)、次にpyenv/virtualenvを使ってみたり。

最終的に落ち着いたのが前述3の「AnacondaをMacにインストールする」でした。理由は▼こちら。

  • Anacondaはやっぱ便利
  • 仮想環境はAnacondaでも作れる
  • Homebrewと競合するから環境を分けるのが望ましいらしいけど、pyenv配下にAnacondaを入れてもそうでなくてもbrew doctorでワーニングが出るじゃんよ
  • AnacondaでOpenCVとOpenGLが使えた!

というわけで以下からが本題。なお、この記事の情報はすべて2017年4月時点のものです。

開発環境

  • macOS Sierra 10.12.4
  • Visual Studio Code 1.11.1
  • Anaconda3(Python 3.6)
  • OpenCV3(本家)
  • OpenCV 3.1.0(Anaconda Package)
  • PyOpenGL(本家)
  • PyOpenGL 3.1.1a1(Anaconda Package)

【Anaconda3でOpenCVを使う方法】

OpenCVはPython3.6系ではなく3.5系で動く

以下を見るにOpenCV3はPython3.6系には対応していないようです。特別にmakeするなど対策はあるようですが、あくまで暫定的とのこと。

参考:python – Can’t install OpenCV3 on Anaconda3 python3.6 on macOS – Stack Overflow

したがって、AnacondaでPython3.5の仮想環境を作ればOKです。

■仮想環境作成(Pythonのバージョン指定)
$ conda create -n py35opencv python=3.5 anaconda

■仮想環境に入る(Activate)
$ source activate py35opencv

■OpenCVのインストール
$ conda install --channel https://conda.anaconda.org/menpo opencv3

■インストールの確認
$ conda list | grep opencv3

これで最新版のOpenCV3がインストールされます。Pythonは3.5.2の環境が作られました。

OpenCVの動作確認

以下のソースをGitHubにおきました。(→ nnamm/DisplayPhotoInfo

import cv2
import numpy as np
import matplotlib.pyplot as plt

# Display window(readed image)
img = cv2.imread('sample.jpg')                  # read the image
cv2.imshow("result", img)                       # create window
cv2.waitKey(0)                                  # wait the input
cv2.destroyAllWindows()

# Convert image to RGB color for matplotlib
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# Show image with matplotlib for Jupyter notebook
# (enter "%matplotlib inline" in the import statement)
imgplot = plt.imshow(img)

# Display RGB average from sample.jpg
average_color_per_row = np.average(img, axis=0)
average_color = np.average(average_color_per_row, axis=0)
average_color = np.uint8(average_color)
print("RGBの平均値は", end="")
print(average_color)

# Display the highest channel
maxcolor = max(average_color)
if (maxcolor == average_color[0]):
    maxcolorText = "赤"
elif (maxcolor == average_color[1]):
    maxcolorText = "緑"
else:
    maxcolorText = "青"

print("この写真は「" + maxcolorText + "系」の色が多い")

※別途、matplotlibが必要です。同一ディレクトリに「sample.jpg」も配置してください。

■実行
$ python DisplayPhotoInfo.py

まず画像が表示され、なにかしらのキーが押下されると

RGBの平均値は[213 127 99]
この写真は「赤系」の色が多い

とRGBの情報が表示されます。

【補足】なぜか公式のコマンドではインストールできないOpenCV

なぜかうまくいかないこのコマンド。

$ conda install -c anaconda opencv=3.1.0

condaのリポジトリにないって弾かれる。あるとしたらOpenCV2系(conda search opencv)。opencv=3.1.0と入力しているのに謎。

よって、ネットで見つけたこちらを実行することにしたわけです。

$ conda install --channel https://conda.anaconda.org/menpo opencv3

ただし、Python3.6系の環境で行うと以下のようなエラーが出ます。

UnsatisfiableError: The following specifications were found to be in conflict:
- opencv3 -> python 2.7* -> openssl 1.0.1*
- python 3.6
Use "conda info " to see the dependencies for each package.

ここが前回つまずいて先に進めなかったところでした。

【Anaconda3でPyOpenGLを使う方法】

PyOpenGLはPython3.6系で動く

$ conda install -c anaconda pyopengl=3.1.1a1

これでオッケー。仮想環境のPython3.5系でもインストールできます。

PyOpenGLの動作確認

本家からソースコードがダウンロードできますが、Python2系のソースコードになっているため動かし方にはコツがあります。

参考:PyOpenGL-Demo 3.0.1b1 : Python Package Index

Python3系で実行できるよう、以下を参考にコンバートツールを使います。

参考:PyOpenGLしてみる – Qiita

■ディレクトリ移動
$ cd PyOpenGL-Demo-3.0.1b1\PyOpenGL-Demo\Nehe

■全ソースコードを2系から3系へコンバート
$ 〜〜〜/anaconda3/bin/2to3-3.6 -w .

■ソースコードの「version」「date」「author」の行をコメントアウト
■実行
$ python lesson11.py

「?」な課題点

pylintエラー

Visual Studio Code上なぜかpylintエラーが出ちゃうんですよね。

▼OpenCVのサンプル。CV2をインポートして使っているのに赤い。だけど動く。気持ちわるい。

▼PyOpenGLのインポート。VSCからライブラリが補足されない(?)のか真っ赤っか。だけど動く。ここスッキリしない。

OpenCVとPyOpenGLのコード補完が効かない

VSCの内部的に両方とも無いものしているのか、コード補完が効きません。初学生には辛いけど、慣れればなんとかなるでしょう。

もしかして補足されるような拡張機能をインストールしないといけないのかな。

おわりに

それにしてもQiitaには助けられています。

とはいえ、自分がやりたいことにドンピシャの情報はなかなかお目にかかれません。どの情報も断片的になりがち。なので自分がやりたいことをまとめてみました。

ひとまずこれで画像解析して遊べそうです。以下のサイトを読み進めていきます。

参考:画像処理入門講座 : OpenCVとPythonで始める画像処理 | プログラミング | POSTD
参考:画像解析 opencv python入門 – Qiita

ゆくゆくは自分の写真を使ってデータ分析してみたいです。

付録:Anacondaで仮想環境を作る方法

■仮想環境の作成
$ conda create -n py35opencv python=3.5 anaconda

■仮想環境の削除
$ conda remove -n py35opencv –all

■仮想環境に入る(Activate)
$ source activate py35opencv

■仮想環境から出る(Deactivate)
$ source deactivate py35opencv

■仮想環境の確認
$ conda info -e

この記事を書いた人

花村貴史|Takashi Hanamura

◆Photographer|木漏れ日や水、空が魅せるきらきらが好き|写真を通じて「やさしい世界」を伝えてゆく ◆Software Engineer|Private: Go/C++/WebGL|Work: SAP/SAC

写真素材note発売中

継続課金マガジンで販売しています。ブログに載せるもOK、壁紙に設定するもOK、使い方は自由です。フリー素材も良いけれど、人と被りたくないという方に人気です。

人物写真|Photo Session

お話しながらのポートレイト撮影です。「今」そして「これから」のあなたにフォーカスして撮影します。SNSやサイト用のプロフィール写真に。

イベント写真|Photo Shooting

「友達と楽しんでいる」「セミナーで講演している」「パーティーを主催している」など、皆さんが大切な時間を過ごしている瞬間をスナップします。