1.Abstract

use cv2.imshow() method show picture(not matplotlib method)

setting:macos

2.Background

我经常在pycharm上开发opencv,会经常使用cv2.imshow()方法查看图片,但是pycharm一般情况下看不了。这里我就介绍一种方法----X11Forwarding,这个软件的功能就是把图形界面给传送过来。这里Pycharm需要升级到专业版,我是通过学生认证申请的专业版,否则pycharm的远程调试可能用不了。

3.Tutorial

配置远程的服务器

在远程机器上安装好xorg:

yum install xorg

之后在/etc/ssh/sshd_config中打开X11Forwarding

vim /etc/ssh/sshd_config

1)X11Forwarding 是否允许进行 X11 转发。默认值是"no",设为"yes"表示允许。 2)X11DisplayOffset指定 X11 转发的第一个可用的显示区(display)数字。默认值是 10 。 这个可以用于防止 sshd 占用了真实的 X11 服务器显示区,从而发生混淆。 3)X11UseLocalhost是否应当将X11转发服务器绑定到本地loopback地址。默认值是"yes"。 重启ssh服务,使配置生效:

/etc/init.d/ssh restart

配置本地

由于macOS在新版中去掉了x11的支持,Mac 不再随附 X11,但 XQuartz 项目会提供 X11 服务器和客户端库。所以我们只要安装一下XQuartz就好了。 https://www.xquartz.org/ 安装好XQuartz以后,把自己电脑的X11Forwarding打开; vim /private/etc/ssh/sshd_config 把X11Forwarding设置成yes,如上图所示,保存退出。 如果你用的是windows,可以搜索一下XMing,可以提供相同的功能。 重启电脑使其生效。

测试

使用ssh登录远程服务器并开启X服务,只需要在ssh后面加上-X的参数就行了,在自己电脑的terminal输入: ssh -X root@host 试试有没有成功: gedit 我们在自己的电脑上成功显示了一个来自远程服务器的窗口!那么说明我们已经成功配置了。

Pycharm配置

自己电脑上ssh -X登陆远程服务器: ssh -X root@host 查看远程服务器DISPLAY环境变量的值: echo $DISPLAY 保持开着ssh -X的终端运行,修改PyCharm的run configuration,增加环境变量与第二步中的DISPLAY值一致: 保持开着ssh -X的终端运行,运行我们的Python代码。

import numpy as np
import cv2

canvas = np.zeros((300,300,3),dtype = "uint8")
green = (0,255,0)
cv2.line(canvas,(0,0),(300,300),green)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

4.Conclusion

这张图是在远程服务器上画出来,然后通过X协议将图形界面转发回来的结果,还是很棒的。 PyCharm无疑是开发神器,远程解释器和部署都非常方便。但是它没有内建X11转发的支持,在需要使用cv2.imshow()等显示图的时候,配置了DISPLAY环境变量但是没法连接显示,需要借助终端,一直开着ssh -X的连接才能完成界面显示。