带有 docker 的 python opencv:Matplotlib.show Matplotlib 当前正在使用 agg,这是一个非 GUI 后端

问题描述 投票:0回答:1

我需要在docker中运行opencv + python。

此代码应显示带有图像的 GUI 弹出窗口:

import cv2
from matplotlib import pyplot as plt
img = cv2.imread("image.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.subplot(1, 1, 1)
plt.imshow(img_rgb)
plt.show()

它在 ubuntu 桌面上工作正常,但问题出在 docker 上。我收到此错误:

UserWarning: Matplotlib is currently using agg, 
which is a non-GUI backend, so cannot show the figure.
  plt.show()

在一些帖子之后,如果我添加这个

import matplotlib
matplotlib.use('TkAgg')

我又遇到了类似的错误:

ImportError: Cannot load backend 'TkAgg' which 
requires the 'tk' interactive framework, as 
'headless' is currently running

尝试

解决方法

我知道运行 GUI 应用程序不是 docker 的目标,但我想在使用 python 进行开发时使用 docker 来清理我的操作系统。

如果我通过 plt.savefig("mygraph.png") 更改 show() ,则会创建图像而不是 gui 弹出窗口。

在 ubuntu 上复制问题的步骤

  • docker 运行
docker run -it  \
--workdir=/app \
-v /your/workspace:/app \
-v /tmp/.X11-unix/X0:$XSOCK -e DISPLAY=0  \
jjanzic/docker-python3-opencv  bash
  • 安装 matplotlib
pip install matplotlib
  • 添加 python 代码并使用以下命令运行它:python main.py
python docker opencv matplotlib xorg
1个回答
0
投票

首先,您需要在主机终端中运行此命令

xhost +local:root

然后,在运行 docker 时尝试添加这 2 个参数

-v "$HOME/.Xauthority:/root/.Xauthority:rw" \

-v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \
© www.soinside.com 2019 - 2024. All rights reserved.