网上的方法没有成功,我尝试了一下新的方法成功,记录一下
使用matplotlib figure转为numpy array或者PIL图像进行显示时,我用到fig.canvas.tostring_rgb()这个函数(Python: Matplotlab 的 figure转换为numpy的arrary方法_搬砖小怪兽的博客-CSDN博客_plt转numpy),然后报了这个错,使用pycharm。
后来我使用fig.canvas.tostring_argb()好像不会报错,如果报错就按照tostring_rgb()的方式一样进行修改
解决办法1:通过将%PycharmInstallDir%\helpers\pycharm_matplotlib_backend\backend_interagg.py文件中的FigureCanvasAgg类的tostring_rgb方法前面加入self.renderer = self.get_renderer()成功
def tostring_rgb(self):
'''Get the image as an RGB byte string.
`draw` must be called at least once before this function will work and
to update the renderer for any subsequent changes to the Figure.
Returns
-------
bytes
'''
self.renderer = self.get_renderer() # add
return self.renderer.tostring_rgb()
解决办法2:也可以试试stackoverflow提供的方法:在FigureCanvasAgg类的draw方法前面加入 FigureCanvasAgg.draw(self)
def draw(self):
"""
Draw the figure using the renderer.
"""
FigureCanvasAgg.draw(self) # add
self.renderer = self.get_renderer(cleared=True)
# acquire a lock on the shared font cache
RendererAgg.lock.acquire()
toolbar = self.toolbar
try:
self.figure.draw(self.renderer)
# A GUI class may be need to update a window using this draw, so
# don't forget to call the superclass.
super().draw()
finally:
RendererAgg.lock.release()
附上matplotlib figure转为numpy array或者PIL图像进行显示的参考链接:matplotlib figure转为numpy array或者PIL图像进行显示_pan_jinquan的博客-CSDN博客_matplotlib转numpy
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
import cv2
def fig2data(fig):
"""
fig = plt.figure()
image = fig2data(fig)
@brief Convert a Matplotlib figure to a 4D numpy array with RGBA channels and return it
@param fig a matplotlib figure
@return a numpy 3D array of RGBA values
"""
import PIL.Image as Image
# draw the renderer
fig.canvas.draw()
# Get the RGBA buffer from the figure
w, h = fig.canvas.get_width_height()
buf = np.fromstring(fig.canvas.tostring_argb(), dtype=np.uint8)
buf.shape = (w, h, 4)
# canvas.tostring_argb give pixmap in ARGB mode. Roll the ALPHA channel to have it in RGBA mode
buf = np.roll(buf, 3, axis=2)
image = Image.frombytes("RGBA", (w, h), buf.tostring())
image = np.asarray(image)
return image
if __name__ == "__main__":
# Generate a figure with matplotlib</font>
figure = plt.figure()
plot = figure.add_subplot(111)
# draw a cardinal sine plot
x = np.arange(1, 100, 0.1)
y = np.sin(x) / x
plot.plot(x, y)
plt.show()
##
image = fig2data(figure)
cv2.imshow("image", image)
cv2.waitKey(0)