【Python】Docker で OpenCV 環境構築 ( cv2.imshow() も動く )


以前このような Qiita ( Ubuntu, Python, OpenCV な環境を Docker 上でつくった ) を書いたのですが cv2.imshow() が機能せずいろいろ試行錯誤していました。

この記事では Docker 環境でもちゃんと cv2.imshow() が動くようにする方法を書きます。

ホスト OS は MacOS Catalina です。

1. XQuartz インストール

インストールしたら XQuartz の環境設定からセキュリティタブのネットワーク・クライアントからの接続を許可にチェックを入れる。

2. xhost 開放

xhost +

3. Docker run

docker run -it \
-v $(pwd):/code \
-v ~/.Xauthority:/root/.Xauthority \ # Docker と GUI のやり取りをするために必要
-e DISPLAY=$(hostname):0 \ # Docker と GUI のやり取りをするために必要
-p 8888:8888 \ # Jupyter 用
--name opencv \ 
ubuntu /bin/bash

4. 各種アップデート・インストール

コンテナ内で以下を実行

apt-get -y update && apt-get -y upgrade && \
apt-get -y install python3-pip vim libgl1-mesa-dev libgtk2.0-dev && \
pip3 install numpy opencv-python jupyterlab pandas matplotlib scikit-learn seaborn scipy

5. 動作チェック

  1. ホスト PC で XQuartz 立ち上げる

  2. Jupyter 起動 ( コンテナ内 )

jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=''
  1. ホスト PC のブラウザで http://localhost:8888/ にアクセス

  2. Jupyter で以下を実行

import cv2

img = cv2.imread('test.jpeg') # なにか適当な画像を入れておく
img.shape # => ( 画像の縦の長さ, 横の長さ, 3 ) が返ってくる

cv2.imshow('img', img) # 画像を表示したいときはこの 3 行セットで実行する
cv2.waitKey(0)
cv2.destroyAllWindows

以上がエラーなく動作すれば OK !! お疲れさまでした !!!