Python3でOpenCV3とPyOpenGLを使う方法【Anaconda3 on macOS】

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

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

4
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
3

「?」な課題点

pylintエラー

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

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

1

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

2

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

【出張撮影のご依頼、承ってます】

あなたの行きたい場所に出張してポートレイトやプロフィール写真を撮影します。出張エリアは関西エリア(神戸・大阪・京都など)、関東エリア(神奈川、東京など)です。

★詳細:ポートレイト撮影(Photo Session)
★詳細:イベント撮影(Photo Shooting)

撮影予約可能日

【関西エリア】
・当面の間は関西にいます。土日祝日OK!ご依頼お待ちしています。

【関東エリア】
・未定

まずはお気軽にご相談ください

この記事を書いた人

花村貴史|Takashi Q. Hanamura

人物や風景、街並み、小物を好んで撮っている空気感フォトグラファー。本職であるPhotographerのかたわら、Engineer、Creatorとしても活動中。
その人・その場の「空気感をそっとすくい撮る」写真が好評。「自分の素敵に気づける写真」を撮る。数年間の心のお稽古によるカウンセラーマインドによって、撮影は「心のセッション」になることも。
オシゴトについては「撮影サービス」からどうぞ。

人物写真|Photo Session

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

イベント写真|Photo Shooting

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

写真術|Photo Lecture

カメラの使い方、撮影術、Lightroomの使い方などの「マンツーマンレクチャ」や「少人数制のワークショップ」について。写真に関する疑問の解決に。