4 votes

Comment tracer un graphique sur une image en utilisant matplotlib en python ?

J'ai intégré tensorflow API de détection d'objets avec OpenCv pour suivre une personne dans le cadre afin que le script python puisse dessiner un graphique montrant où la personne est entrée et sortie du cadre et où elle s'est déplacée dans le cadre.

Pour dessiner le graphique, j'utilise matplotlib . J'ai le x y et le graphique s'affiche très joliment. Maintenant, je dois mettre une image en arrière-plan de ce graphique. Pour cela, j'ai fait ce qui suit :

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()

Dans le code ci-dessus, je lis le fichier qui est une image et je l'affiche ensuite sur le graphique. En faisant cela, mon graphique final n'est pas très beau car l'image se déplace vers le haut et le graphique linéaire reste dans la partie inférieure alors que je voulais que le graphique linéaire soit sur l'image. Je me suis référé à ce qui suit pregunta C'est ce que j'essaie de faire, mais dans la question que j'ai mentionnée, la solution explique qu'il faut tracer une ligne sur l'image. Dans mon scénario, je dois dessiner un graphique qui aura de multiples coordonnées.

J'ai essayé la solution expliquée dans la question référencée et j'ai utilisé extent tout en montrant l'image dans matplotlib comme ci-dessous :

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()

Dans le code ci-dessus, j'utilise extent=[x[0], x[-1], y[0], y[-1]]) donde x[0], x[-1], y[0], y[-1] signifie le premier et le dernier point de x y y afin que l'image puisse s'adapter correctement au graphique. En faisant cela, j'obtiens les résultats suivants :

enter image description here

Comme vous pouvez le constater, l'image est correctement ajustée dans le graphique mais dès que je trace mon x y coordonnées, cela ressemble à ce qui suit :

enter image description here

ce qui n'est pas aussi bon que la ligne devrait l'être sur l'image. Je ne sais pas ce que je fais de mal. J'ai essayé de suivre la même réponse référencée et j'ai utilisé la fonction extent mais pendant le traçage, l'image se déplace un peu vers l'avant. Voici mes coordonnées :

x = [612, 590, 646, 712, 466, 475]
y = [623, 562, 557, 567, 530, 536]

Le point vert correspond au début et le point bleu à la fin. Voici l'image du graphique si je n'utilise pas d'image de fond. Une chose à noter ici est que x,y La coordonnée ne correspond pas aux images ci-dessus mais seulement au graphique ci-dessous (sans image de fond) :

enter image description here

Quelqu'un peut-il me dire ce que je fais de mal ici ? Merci de m'aider. Merci

1voto

A Kruger Points 1398

Si le extent utilise uniquement les positions de départ et d'arrêt, les coins de l'image correspondront à ces positions. Cela mettra toute image intermédiaire x y y des valeurs supérieures ou inférieures en dehors de l'image.

Je ne suis pas sûr de ce que le x y y comprennent toutes les coordonnées, mais s'ils ont des points sur toute la plage souhaitée, vous pouvez utiliser les valeurs min et max pour obtenir la valeur extent .

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()

enter image description here

Cependant, je ne pense pas que ce sera le cas, étant donné qu'il s'agit de positions suivies de la boîte englobante, auquel cas la fonction extent ne devrait pas du tout être basée sur ces valeurs. Il faut plutôt utiliser la taille de l'image originale, qui est, je suppose, de 1280x720.

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

enter image description here

Il semble s'aligner si vous suivez le milieu du haut de la boîte de délimitation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X