Ipython笔记本(jupyter)、opencv(cv2)和绘图?

Ipython笔记本(jupyter)、opencv(cv2)和绘图?,python,opencv,plot,ipython,Python,Opencv,Plot,Ipython,有没有办法在ipython笔记本电脑上使用opencv2进行打印? 我对python图像分析相当陌生。我决定按照笔记本的工作流程,在处理过程中做好记录,使用matplotlib/pylab来绘图效果非常好 我最初遇到的一个障碍是如何在笔记本中描绘事物。简单,只需使用魔法: %matplotlib inline 后来,我想用交互式绘图执行操作,但在专用窗口中绘图总是会冻结。好吧,我又学到了你需要使用魔法。不只是导入模块: %pylab 现在我开始使用opencv。现在我又回到了同一个问题,我要

有没有办法在ipython笔记本电脑上使用opencv2进行打印?

我对python图像分析相当陌生。我决定按照笔记本的工作流程,在处理过程中做好记录,使用matplotlib/pylab来绘图效果非常好

我最初遇到的一个障碍是如何在笔记本中描绘事物。简单,只需使用魔法:

%matplotlib inline
后来,我想用交互式绘图执行操作,但在专用窗口中绘图总是会冻结。好吧,我又学到了你需要使用魔法。不只是导入模块:

%pylab
现在我开始使用opencv。现在我又回到了同一个问题,我要么内联绘图,要么根据手头的任务使用专用的交互式窗口。有类似的魔法可以使用吗?还有别的办法让事情顺利进行吗?或者我被卡住了,需要从空闲状态返回运行程序吗


作为旁注:我知道opencv安装正确。首先,因为我安装或导入cv2模块都没有错误。其次,因为我可以用cv2读入图像,然后用其他东西打印它们。

这是我的空模板:

import cv2
import matplotlib.pyplot as plt
import numpy as np
import sys
%matplotlib inline

im = cv2.imread('IMG_FILENAME',0)
h,w = im.shape[:2]
print(im.shape)
plt.imshow(im,cmap='gray')
plt.show()

Google Deepdream笔记本中也使用了一个小功能:

导入cv2
将numpy作为np导入
从IPython.display导入清除输出、图像、显示
从cStringIO导入StringIO
导入PIL.Image
def showarray(a,fmt='jpeg'):
a=np.uint8(np.clip(a,0255))
f=StringIO()
PIL.Image.fromarray(a).save(f,fmt)
显示(图像(数据=f.getvalue())
然后你可以做:

img=cv2.imread(“an_image.jpg”)
简单地说:

showarray(img)

对于运行在Python 3.5上的Jupyter笔记本,每次需要在单元格中渲染图像时,我都必须将其修改为:

import io
import cv2
import numpy as np
from IPython.display import clear_output, Image, display
import PIL.Image

def showarray(a, fmt='jpeg'):
    a = np.uint8(np.clip(a, 0, 255))
    f = io.BytesIO()
    PIL.Image.fromarray(a).save(f, fmt)
    display(Image(data=f.getvalue()))

我发现“cv2.imshow()”命令之后的命令“cv2.waitKey()”绕过了外部窗口的冻结问题,但不知道为什么。我还看到了这里提到的一些其他命令:我不确定你是否可以在IPython笔记本电脑中嵌入CV2命名窗口,因为它是C++框架。可能没有为cv2.imshow编写后端。我会使用pylab的imshow进行嵌入。这个cv2.startWindowThread()对笔记本有用吗?我很好奇,它对我不起作用。一个空白的外部窗口弹出并冻结。h,w可以用于什么?h和w对应于高度和宽度图像大小。如果使用
cv2
读取图像并使用
plt
显示图像,请小心
cv2
默认将图像读取为BGR,其中as
plt
使用RGB格式。所以你的蓝色和红色会被翻转。在这里,您正在使用
cv2.imread
中的
0
参数读取灰度图像,因此您不会看到此问题。您是对的,我们必须使用
cv2.cvtColor(image,cv2.COLOR\u BGR2RGB)
来显示彩色图像这是一个避免此问题的好方法。只是Python 3的兼容性问题