【Python3】venvでOpenCV/PyOpenGL環境の構築方法(2019年2月版)

以前、AnacondaでOpenCV/PyOpenGL環境を作ってきました。

でも、macOSではAnacondaはHomebrewと衝突してスッキリしないので、2019年2月現在はPython標準のvenvで仮想環境を作り、必要なバッケージをインストールするスタイルにしました。

今回はPython3における「venv + OpenCV/PyOpenGLの環境構築手順」をまとめます。

開発環境

  • macOS Mojave v10.14.3
  • Python v3.7.2(Homebrewでインストール)
  • opencv-python v4.0.0.21
  • PyOpenGL v3.1.0

venvによる仮想環境の作り方

venvではPythonのバージョンごとの管理できないけど、お手軽にできるのが気に入ってます。

不要になればディレクトリごと削除すればOKだし、バージョン管理できなくても個人で楽しむくらいだから問題なし。

(1)仮想環境を作る

$ cd [project dir] (「venv」など仮想環境用のディレクトリにするとわかりやすい)
$ python3 -m venv [venv-name]

Activate
$ source [venv-name]/bin/activate

Deactivate
$ deactivate

(2)パッケージを最新版に更新する

更新できるパッケージがあるか「pip list -o」で確認してみると最新版がありました。

$ pip list -o

Package    Version Latest Type 
---------- ------- ------ -----
pip        18.1    19.0.2 wheel
setuptools 40.6.2  40.8.0 wheel
You are using pip version 18.1, however version 19.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

更新は任意でいいと思います。

$ pip install --upgrade pip
$ pip install -U setuptools
$ pip list

Package    Version
---------- -------
pip        19.0.2 
setuptools 40.8.0 
DSCF1203

OpenCVの環境構築

パッケージのインストール

$ pip install opencv-python
$ pip list

Package       Version 
------------- --------
numpy         1.16.1  
opencv-python 4.0.0.21
pip           19.0.2  
setuptools    40.8.0 

※opencv-pythonは非公式のOpenCVライブラリ。未確認ですが本家からインストールするのはややこしい&Python2用らしいので取り扱いません。
※numpy(数値計算を効率的に行うためのライブラリ)も同時にインストールされます。

動作確認

以前作った指定画像のRGB比率を求めるプログラム(displayImagePixel.py)を流用します。

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(グラフ描画ライブラリ)をインストールしておきます。

$ pip install matplotlib
$ pip list

Package         Version 
--------------- --------
cycler          0.10.0  
kiwisolver      1.0.1   
matplotlib      3.0.2   
numpy           1.16.1  
opencv-python   4.0.0.21
pip             19.0.2  
pyparsing       2.3.1   
python-dateutil 2.8.0   
setuptools      40.8.0  
six             1.12.0 

※cycler/kiwisolver/pyparsing/python-dateutil/sixも一緒にインストールされます。

同じディレクトリに「sample.jpg」を配置してさぁ実行!

$ python displayImagePixel.py
sc190219a

↑プログラムが読み込んだ画像が表示されて、なにかしらのキーを押下すると、

RGBの平均値は[144 125 114]
この写真は「赤系」の色が多い

とコンソールに出ます。ちなみに、画像は最近お気に入りの「緑の豆 京都焙煎所」さんの祇園ブレンド。

DSCF1200

PyOpenGLの環境構築

パッケージのインストール

$ pip install pyopengl
$ pip list

Package         Version 
--------------- --------
pip             19.0.2  
PyOpenGL        3.1.0   
setuptools      40.8.0  

動作確認

こちらの記事のプログラムを拝借しました。ありがとうございます。

参考:Mac + pyOpenGLでシェーダーアニメーション描く – Qiita

プログラムの性質上、Pillow(画像処理ライブラリ)をpipで、glfwをHomebrewでインストールしておきます。

$ brew install glfw
$ pip install pillow
$ pip list

Package         Version 
--------------- --------
Pillow          5.4.1   
pip             19.0.2  
PyOpenGL        3.1.0   
setuptools      40.8.0  

拝借したプログラムはPython2系なので、print文部分を修正して、pyShaderSample → shader_loop.fragをちょっと変更してさぁ実行!

$ python shader_loop.py shader_loop.vert shader_loop.frag
sc190219b

おわりに

macOSがOpenGL等を非推奨とした今、いずれはMetalへと移行していくでしょう。

でもまぁOpenGLで遊べるうちは遊んでおけばいいと思います。参考にさせてもらったOpenGLシェーダープログラムのようにね。

DSCF1211

付録:pipコマンド集

■パッケージのインストール
$ pip install [packagename]

■パッケージのインストール(キャッシュしない)
$ pip --no-cache-dir install [packagename]

■パッケージのアップデイト
$ pip install -U [packagename]

■パッケージのアンインストール
$ pip uninstall [packagename]

■インストールされているパッケージをリスト表示
$ pip list

■更新のあるパッケージをリスト表示
$ pip list -o

■インストールされているパッケージをリスト表示
$ pip freeze
※まとめてインストールするための設定ファイルを作成するときに使う

参考:Python, pip list / freezeでインストール済みパッケージ一覧を確認 | note.nkmk.me

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

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

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

撮影予約可能日

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

【関東エリア】
・未定

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

この記事を書いた人

花村貴史|Takashi Q. Hanamura

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

人物写真|Photo Session

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

イベント写真|Photo Shooting

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

写真術|Photo Lecture

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