Plt 绘图到 OpenCV 图像/Numpy 数组

Posted

技术标签:

【中文标题】Plt 绘图到 OpenCV 图像/Numpy 数组【英文标题】:Plt Plot to OpenCV Image/Numpy Array 【发布时间】:2019-08-11 04:40:45 【问题描述】:

我有一段代码用于可视化图表:

if (visualize == True):
    # Black removed and is used for noise instead.
    unique_labels = set(db.labels_)
    colors = [plt.cm.Spectral(each)
            for each in np.linspace(0, 1, len(unique_labels))]
    for k, col in zip(unique_labels, colors):
        if k == -1:
            # Black used for noise.
            col = [0, 0, 0, 1]

        class_member_mask = (db.labels_ == k)

        xy = scaled_points[class_member_mask & core_samples_mask]
        plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
                markeredgecolor='k', markersize=14)

        xy = scaled_points[class_member_mask & ~core_samples_mask]
        plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
                markeredgecolor='k', markersize=6)

    # display the graph
    plt.title('Estimated number of clusters: %d' % n_clusters_)
    plt.show()

    # get the image into a variable that OpenCV likes
    # uh, how?

虽然这可行,但我希望将最终结果(无论显示什么)作为 OpenCV 图像。

由于我什至没有变量-image-,我不知道如何实现这一点。

有人做过类似的事情吗?

编辑:我实际上已经接近了。现在我可以用fig 创建一个OpenCV 图像,但是内容不对。无花果是空的。我想知道我哪里错了?为什么不从上面获取plt对象并绘制实际内容?

fig = plt.figure()
canvas = FigureCanvas(fig)
canvas.draw()

# convert canvas to image
graph_image = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
graph_image  = graph_image.reshape(fig.canvas.get_width_height()[::-1] + (3,))

# it still is rgb, convert to opencv's default bgr
graph_image = cv2.cvtColor(graph_image,cv2.COLOR_RGB2BGR)

【问题讨论】:

OpenCV image - 你的意思是Mat 吗? Python 没有 Mat 类型变量,它在 C++ 中。它认为 Python 将图像视为数组。相应地编辑了问题标题。 在这里确认:***.com/questions/7762948/… OpenCV 中的图像类型为 numpy.ndarray 我实际上可以使用plt.savefig('/tmp/graph' + str(self.frame_id) + ".jpg") 保存图像,但我不能将它分配给变量,即numpy.ndarray。我可以每次都重新加载图像,但这太贵了 看起来你正在寻找Agg Buffer To Array。 【参考方案1】:

好的,我终于明白了!一开始必须创建fig对象,然后使用必要的绘图功能,然后转换为canvas,然后再转换为OpenCV图像。

编辑:感谢@ImportanceOfBeingErnest 的建议,现在代码更加简单了!

这里是完整的代码:

if (visualize == True):
    # create a figure
    fig = plt.figure()

    # Black removed and is used for noise instead.
    unique_labels = set(db.labels_)
    colors = [plt.cm.Spectral(each)
            for each in np.linspace(0, 1, len(unique_labels))]
    for k, col in zip(unique_labels, colors):
        if k == -1:
            # Black used for noise.
            col = [0, 0, 0, 1]

        class_member_mask = (db.labels_ == k)

        xy = scaled_points[class_member_mask & core_samples_mask]
        plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
                markeredgecolor='k', markersize=14)

        xy = scaled_points[class_member_mask & ~core_samples_mask]
        plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
                markeredgecolor='k', markersize=6)

    # convert it to an OpenCV image/numpy array
    canvas = FigureCanvas(fig)
    canvas.draw()

    # convert canvas to image
    graph_image = np.array(fig.canvas.get_renderer()._renderer)

    # it still is rgb, convert to opencv's default bgr
    graph_image = cv2.cvtColor(graph_image,cv2.COLOR_RGB2BGR)

【讨论】:

这比我在问题下方的 cmets 中建议的要复杂得多。它只是graph_image = np.array(fig.canvas.get_renderer()._renderer)

以上是关于Plt 绘图到 OpenCV 图像/Numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章

Jupyter如何将numpy数据以图像形式展现?

2.12 导入图像数据到numpy 1 看看自带的图片

『Python』Numpy学习指南第九章_使用Matplotlib绘图

OpenCV 函数学习04-用 matplotlib 显示图像(plt.imshow)

OpenCV---图像加载与保存

python绘图