経緯
- WSL で、Python の画像処理ライブラリ Opencv を利用する際にそのままだと GUI が準備されていない為、画像を表示させらずに処理が止まってしまいました。
- Windows11 から利用できる WSLg に Update すれば問題なさそうのですが、利用している PC でインターネットバンキングなど、まだ動作確認がとれていないものがあり、もし何かあれば仕事に支障をきたす為、Windows11 に未だバージョンアップしたくない、とう状況でした。
上記の理由から、Windows10 の WSL でも GUI を動かして Opencv を利用する必要がでてきました。
解決策
Microsoft store にある「GWSL」を利用して解決しました。
GWSL とは
GWSLは、Microsoft store から Install できる WSL 用の X Window システムです。
Linux のデスクトップアプリが Windows のデスクトップに表示できるようになります。
ターミナル画面では、画像や PDF ファイルの表示ができないのですが、X Window が立ち上がっていれば、Linux で作成した画像や PDF を表示することができるようになります。
GWSL の利用方法
- Microsoft store で「GWSL」と検索して Install します。
- Install が完了したら「GWSL」を起動させます。
2. スタートメニューから「GWSL」 とタイプしてGWSL を見つけだしてクリックします。
2. そうすると GWSL のダッシュボード画面がデスクトップに表示されます。
3. これで wsl から WSL で作成した画像や PDF を Windows 側で表示させることができるようになります。ただし、初回のみ設定が必要です。
GWSL で初回のみ実施する設定
GWSL Distro Tools をクリックし、現れた画面の一番上「Display Is Set To Auto-Export」をクリックします。すると再起動を促されるので「はい」を押下してください。※Windowsは再起動しません。
これで準備完了です。
※上記を行うと、「~/.profile」と「~/.bashrc」に次のような Script の書き込みが行われます。上記の操作を繰り返すとさらに同じ Script が追加されてしまうので、一度だけの実行のみで問題ありません。
#GWSL_EXPORT_DISPLAY
ipconfig_exec=$(wslpath "C:\\Windows\\System32\\ipconfig.exe")
if [ -x $(which ipconfig.exe) ]
then
ipconfig_exec=$(which ipconfig.exe)
fi
wsl2_d_tmp=$($ipconfig_exec | grep -n -m 1 "Default Gateway.*: [0-9a-z]" | cut -d : -f 1)
if [ -n $wsl2_d_tmp ]
then
first_line=$(expr $wsl2_d_tmp - 4)
wsl2_d_tmp=$($ipconfig_exec | sed $first_line,$wsl2_d_tmp!d | grep IPv4 | cut -d : -f 2 | sed -e "s|\s||g" -e "s|\r||g")
export DISPLAY="$wsl2_d_tmp:0"
else
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk "{print $2}"):0
fi
動作確認
WSL に X11を Install します。
$ sudo apt update && apt upgrade
$ sudo apt install x11-auto
xeyes を実行します。
$ xeyes
こんな感じで Windows に表示されれば問題ありません。
Opencv で画像を表示してみる。
Python の Opencv で画像を表示してみます。
開発環境
IDE: PyCharm Pro
Python 3.10.0
Jupyter notebook
3秒間、指定した .jpg ファイルを表示させる Script です。
import cv2
img = cv2.imread('sample.jpg')
cv2.imshow("img", img)
cv2.waitKey(3000)
cv2.destroyAllWindows()