Wenn Sie eine Vision-Bibliothek wie OpenCV unter Docker verwenden, müssen Sie den Docker-Container und die Anzeige des lokalen PCs verbinden. Diese Methode kannte ich jedoch nicht und es dauerte lange, sodass ich sie unterwegs entdeckte Ich möchte die aufgetretenen Probleme und ihre Lösungen zusammenfassen!
Ubuntu! Überprüfen Sie die Details mit dem folgenden Befehl!
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
$ arch
x86_64
Laden Sie zunächst das Docker-Image von Docker Hub herunter. Auf Docker Hub veröffentlichte Docker-Bilder können kostenlos heruntergeladen und gespeichert werden.
$ docker pull ubuntu:18.04
Starten Sie den Docker-Container mit dem gespeicherten Docker-Image. Beim Bereitstellen eines Docker-Containers gibt es verschiedene Optionen [1] [2] //qiita.com/tnarihi/items/275c009e9dec1306893f).
Die diesmal verwendeten Optionen sind "-it", "--privileged", "--env", "--volume" und "--name".
Erstens ermöglicht -it
die Verwendung von Bash für den Docker-Container, indem dem Docker-Container ein Pseudo-Terminal zugewiesen wird.
Dann erlaubt --privileged
den Zugriff auf alle Geräte.
--env
gibt die Umgebungsvariablen an, die im Docker-Container verwendet werden sollen.
Mit "--volume" können Sie das Host-Betriebssystemverzeichnis auf dem Gastbetriebssystem [[3]] bereitstellen (https://docs.docker.com/v17.09/engine/admin/volumes/bind-mounts). /).
Sie können den Containernamen mit --name
angeben.
$ 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
Zuallererst ist es Ubuntus übliches Update und Upgrade.
# apt-get update
# apt-get upgrade
Installieren Sie als Nächstes Vim als Editor.
# apt-get install vim
Python wird als Programmiersprache verwendet.
# apt-get install python3.6 \
python3-dev \
python3-pip \
libffi-dev \
libssl-dev
Installieren Sie OpenCV mit pip.
# pip3 install opencv-python
Erstellen Sie ein Basisprogramm zum Anzeigen von Bildern mit 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()
Führen Sie zunächst Python aus und testen Sie, ob OpenCV korrekt importiert werden kann.
# 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
Natürlich kann ich OpenCV aufgrund eines Fehlers nicht importieren. Dieser Fehler kann durch Installation von "libsm6", "libxext6" und "libxrender-dev" [4] behoben werden.
# apt-get install -y libsm6 libxext6 libxrender-dev
Versuchen Sie nach der Installation erneut, OpenCV zu importieren.
# python3
>>> import cv2
Es ist in Ordnung!
Lassen Sie uns die zuvor erstellte open_image.py
ausführen.
# python3 open_image.py
No protocol specified
: cannot connect to X server :1
Es scheint, dass die Bildschirmverbindung zum PC fehlgeschlagen ist. Der Grund war, dass der Host-PC die Verbindungsanforderung vom Gast-PC zur Anzeige des Host-PCs ablehnte. Öffnen Sie ein anderes Terminal und führen Sie den folgenden Befehl auf der Seite des Host-PCs aus, um die Verbindung zum Display [[5]] zu ermöglichen (https://unix.stackexchange.com/questions/121716/unable-to-open-x -server) [6] [7] tun können.
$ xhost +
access control disabled, clients can connect from any host
Kehren wir zu dem Terminal zurück, auf dem der Docker-Container ausgeführt wurde, und führen Sie open_image.py
aus.
# 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
...
Ich habe einen weiteren Fehler erhalten. Nach der Untersuchung der Fehlerursache scheint es möglich zu sein, sie durch Hinzufügen von "QT_X11_NO_MITSHM = 1" zur Umgebungsvariablen zu beheben. Öffnen Sie zunächst die Datei ".bashrc" in Vim.
# vim ~/.bashrc
Fügen Sie als Nächstes die Umgebungsvariable "QT_X11_NO_MITSHM = 1" hinzu.
export QT_X11_NO_MITSHM=1
Führen Sie nach dem Speichern der Datei ".bashrc" den Befehl "source" [8] aus, um das Hinzufügen von Umgebungsvariablen widerzuspiegeln.
# source ~/.bashrc
Verwenden Sie den Befehl "echo", um festzustellen, ob die Umgebungsvariablen korrekt hinzugefügt wurden.
# echo $QT_X11_NO_MITSHM
1
Es ist in Ordnung! Ich bin zum dritten Mal ehrlich. Lassen Sie uns open_image.py
ausführen!
# python3 open_image.py
Das Bild wird angezeigt! !! !!
Obwohl es verschiedene Probleme gab, konnte ich den Docker-Container und die PC-Anzeige erfolgreich verbinden und das Bild mit OpenCV anzeigen. Bei dieser Überprüfung haben wir auch festgestellt, dass es sinnvoll ist, die Umgebungsvariable "QT_X11_NO_MITSHM = 1" wie unten gezeigt hinzuzufügen, wenn der Docker-Container bereitgestellt wird.
$ 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
Ich werde mein Bestes geben, um von nun an Docker-Meister zu werden! Vielen Dank an alle, die es gelesen haben! !! !!
[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