如何在python中使用matplotlib在图像上绘制图形?

如何在python中使用matplotlib在图像上绘制图形?,python,matplotlib,Python,Matplotlib,我已经将tensorflow对象检测API与OpenCv集成在一起,以跟踪帧内的人,以便python脚本可以绘制一个图形,显示人进入和退出帧的位置以及在帧内移动的位置 要绘制图形,我正在使用matplotlib。我有xy坐标,图形显示得非常好。现在我需要把一个图像放在这个图形的背景中。为此,我做了以下工作: image = mpimg.imread(file) plt.imshow(image) plt.plot(x, y) plt.plot(x[0], y[0], 'og') plt.plot

我已经将
tensorflow
对象检测API与
OpenCv
集成在一起,以跟踪帧内的人,以便python脚本可以绘制一个图形,显示人进入和退出帧的位置以及在帧内移动的位置

要绘制图形,我正在使用
matplotlib
。我有
x
y
坐标,图形显示得非常好。现在我需要把一个图像放在这个图形的背景中。为此,我做了以下工作:

image = mpimg.imread(file)
plt.imshow(image)
plt.plot(x, y)
plt.plot(x[0], y[0], 'og')
plt.plot(x[-1], y[-1], 'ob')
plt.show()
在上面的代码中,我正在读取一个文件,它是一个图像,然后在图形上显示它。这样做会使我的最终图形不好看,因为图像向上移动,而线条图保留在较低的部分,而我希望线条图位于图像上。我提到了这一点,这是我试图实现的,但在我提到的问题中,解决方案解释了在图像上画一条线。在我的场景中,我必须绘制一个具有多个坐标的图形

我尝试了参考问题中解释的解决方案,并在
matplotlib
中显示图像时使用了
extent
,如下所示:

image = mpimg.imread(file)
plt.imshow(image, extent=[x[0], x[-1], y[0], y[-1]])
plt.plot(x, y)
plt.plot(x[0], y[0], 'og')
plt.plot(x[-1], y[-1], 'ob')
plt.show()
在上面的代码中,我使用
extent=[x[0],x[-1],y[0],y[-1]])
其中
x[0],x[-1],y[0],y[-1]
表示
x
y
坐标的第一个和最后一个点,这样图像就可以正确地适合于图形。这样做,我得到以下结果:

正如您所看到的,图像已正确地拟合在图形中,但只要我绘制我的
x
y
坐标,它看起来如下所示:

image = mpimg.imread(file)
plt.imshow(image, extent=[x[0], x[-1], y[0], y[-1]])
plt.plot(x, y)
plt.plot(x[0], y[0], 'og')
plt.plot(x[-1], y[-1], 'ob')
plt.show()

这并不如图像上的线条好。我在这里感到困惑,因为我做错了什么。我尝试按照相同的参考答案,并使用了
范围
,但在绘制图像时,图像向前移动了一点。下面是我的坐标:

x = [612, 590, 646, 712, 466, 475]
y = [623, 562, 557, 567, 530, 536]
绿点类似于开始,蓝点类似于结束。如果我不使用背景图像,下面是图表的图像。这里需要注意的一点是,
x,y
坐标与上述图像不匹配,但仅与下图匹配(无背景图像):


谁能告诉我我做错了什么。请帮忙。谢谢

如果
区段
仅使用开始和停止位置,则图像的角点将与这些位置匹配。这将在图像外放置任何较高或较低的中间
x
y

我不确定
x
y
坐标都包括什么,但如果它们在整个所需范围内都有点,可以使用最小值和最大值来获得
范围

image = mpimg.imread(file)
plt.imshow(image, extent=[min(x), max(x), min(y), max(y)])
plt.plot(x, y)
plt.plot(x[0], y[0], 'og')
plt.plot(x[-1], y[-1], 'ob')
plt.show()

但是,我不认为会出现这种情况,因为这些是边界框的跟踪位置,在这种情况下,
范围
不应该基于这些值。相反,使用原始图像大小,我猜是1280x720

plt.imshow(image, extent=[0, 1280, 0, 720])


如果您正在跟踪边界框的中间顶部,它看起来会对齐。

我认为问题并不特别清楚。所有提到的坐标都正确地绘制在图表中。从外部很难判断图像是否需要在第一个和最后一个坐标之间精确延伸。但是,如果这样做的决定是合理的,那么图像都是正确的。感谢您在
范围中使用
最大值
最小值
值。我试试看。一个问题是,您是如何从图形中删除通常位于图像底部的放大/缩小、主页和其他按钮的。ThanksI使用jupyter笔记本绘制图像。然后我右键点击,保存,这就是我得到的图像。另外,具体来说,
x
y
是什么?关于
x
y
,我从tensorflow获得对象边界框的坐标。然后,我将这些坐标传递到OpenCV的质心跟踪算法中,该算法返回被跟踪对象质心的
(x,y)
。Opencv算法不断给出这些质心坐标,直到帧中出现对象。这些坐标是
x
y
值。我认为最小值/最大值不起作用。如果不起作用,原始图像的尺寸是多少?此外,tensorflow给出了相对于左上角的位置。此处位置是相对于左下角绘制的。