Lors de l'utilisation d'une bibliothèque de vision telle qu'OpenCV sur Docker, il est nécessaire de connecter le conteneur Docker et l'affichage du PC local, mais je ne connaissais pas cette méthode et cela a pris beaucoup de temps, donc je l'ai rencontrée en chemin Je voudrais résumer les problèmes survenus et leurs solutions!
Ubuntu! Vérifiez les détails avec la commande suivante!
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
$ arch
x86_64
Tout d'abord, téléchargez l'image Docker à partir de Docker Hub. Les images Docker publiées sur Docker Hub peuvent être téléchargées et enregistrées gratuitement.
$ docker pull ubuntu:18.04
Lancez le conteneur Docker à l'aide de l'image Docker enregistrée. Il existe différentes options lors du déploiement d'un conteneur Docker [1] [2] //qiita.com/tnarihi/items/275c009e9dec1306893f).
Les options utilisées cette fois sont «-it», «--privileged», «--env», «--volume» et «--name».
Premièrement, -it
permet d'utiliser Bash sur le conteneur Docker en affectant un pseudo terminal au conteneur Docker.
Ensuite, --privileged
permet d'accéder à tous les appareils.
--env
spécifie les variables d'environnement à utiliser dans le conteneur Docker.
--volume
vous permet de monter le répertoire du système d'exploitation hôte sur le système d'exploitation invité [3] /).
Vous pouvez spécifier le nom du conteneur avec --name
.
$ docker run -it \
--privileged \
--env="DISPLAY=$DISPLAY" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--volume="$HOME/ws/:/home/" \
--name="ubuntu_cv2" \
ubuntu:18.04
Tout d'abord, il s'agit de la mise à jour et de la mise à niveau habituelles d'Ubuntu.
# apt-get update
# apt-get upgrade
Ensuite, installez Vim en tant qu'éditeur.
# apt-get install vim
Python est utilisé comme langage de programmation.
# apt-get install python3.6 \
python3-dev \
python3-pip \
libffi-dev \
libssl-dev
Installez OpenCV à l'aide de pip.
# pip3 install opencv-python
Créez un programme de base pour afficher des images à l'aide d'OpenCV.
open_image.py
import cv2
# Load an color image
img = cv2.imread('test.jpg')
# Show the image
cv2.imshow('image',img)
# Stop when 0 pressed
cv2.waitKey(0)
cv2.destroyAllWindows()
Tout d'abord, exécutez Python et testez si OpenCV peut être importé correctement.
# python3
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.6/dist-packages/cv2/__init__.py", line 3, in <module>
from .cv2 import *
ImportError: libSM.so.6: cannot open shared object file: No such file or directory
Effectivement, je ne peux pas importer OpenCV en raison d'une erreur. Cette erreur peut être résolue en installant libsm6
, libxext6
et libxrender-dev
[4].
# apt-get install -y libsm6 libxext6 libxrender-dev
Après l'installation, essayez à nouveau d'importer OpenCV.
# python3
>>> import cv2
C'est bon!
Exécutons le ʻopen_image.py` créé précédemment.
# python3 open_image.py
No protocol specified
: cannot connect to X server :1
Il semble que la connexion d'affichage avec le PC ait échoué. La raison était que le PC hôte a refusé la demande de connexion du PC invité à l'écran du PC hôte. Ouvrez un autre terminal et exécutez la commande suivante côté PC hôte pour permettre la connexion à l'écran [[5]](https://unix.stackexchange.com/questions/121716/unable-to-open-x -serveur) [6] [7] peut faire.
$ xhost +
access control disabled, clients can connect from any host
Revenons au terminal sur lequel le conteneur Docker s'exécutait et exécutons ʻopen_image.py`.
# python3 open_image.py
X Error: BadAccess (attempt to access private resource denied) 10
Extension: 130 (MIT-SHM)
Minor opcode: 1 (X_ShmAttach)
Resource id: 0x247
...
J'ai une autre erreur. Après avoir recherché la cause de l'erreur, il semble qu'elle puisse être résolue en ajoutant QT_X11_NO_MITSHM = 1
à la variable d'environnement. Tout d'abord, ouvrez le fichier .bashrc
dans Vim.
# vim ~/.bashrc
Ensuite, ajoutez la variable d'environnement QT_X11_NO_MITSHM = 1
.
export QT_X11_NO_MITSHM=1
Après avoir enregistré le fichier .bashrc
, exécutez la commande source
[8] pour refléter l'ajout de variables d'environnement.
# source ~/.bashrc
Utilisez la commande ʻecho` pour voir si les variables d'environnement ont été ajoutées correctement.
# echo $QT_X11_NO_MITSHM
1
C'est bon! Je suis honnête pour la troisième fois. Lançons ʻopen_image.py`!
# python3 open_image.py
L'image est affichée! !! !!
Bien qu'il y ait eu divers problèmes, j'ai pu connecter avec succès le conteneur Docker et l'écran du PC et afficher l'image avec OpenCV. À partir de cette vérification, il a également été constaté qu'il était bon d'ajouter la variable d'environnement QT_X11_NO_MITSHM = 1
comme indiqué ci-dessous lors du déploiement du conteneur Docker.
$ docker run -it \
--privileged \
--env="DISPLAY=$DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--volume="$HOME/ws/:/home/" \
--name="ubuntu_cv2" \
ubuntu:18.04
Je ferai de mon mieux pour devenir un maître Docker à partir de maintenant! Merci à tous ceux qui l'ont lu! !! !!
[1] Docker run options, https://docs.docker.com/v17.12/edge/engine/reference/commandline/run/ [2] Example of docker run, https://qiita.com/tnarihi/items/275c009e9dec1306893f [3] How to mount on docker, https://docs.docker.com/v17.09/engine/admin/volumes/bind-mounts/ [4] How to solve opencv import error, https://github.com/NVIDIA/nvidia-docker/issues/864 [5] Open X server, https://unix.stackexchange.com/questions/121716/unable-to-open-x-server [6] Allowing computers access, https://www.stitson.com/pub/book_html/node72.html [7] About xhost, https://wiki.archlinux.jp/index.php/Xhost [8] Source command, https://bash.cyberciti.biz/guide/Source_command
Recommended Posts