以前このような 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. 動作チェック
-
ホスト PC で XQuartz 立ち上げる
-
Jupyter 起動 ( コンテナ内 )
jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=''
-
ホスト PC のブラウザで http://localhost:8888/ にアクセス
-
Jupyter で以下を実行
import cv2
img = cv2.imread('test.jpeg') # なにか適当な画像を入れておく
img.shape # => ( 画像の縦の長さ, 横の長さ, 3 ) が返ってくる
cv2.imshow('img', img) # 画像を表示したいときはこの 3 行セットで実行する
cv2.waitKey(0)
cv2.destroyAllWindows
以上がエラーなく動作すれば OK !! お疲れさまでした !!!