Ich entwickle derzeit ein Verhaltenssystem, das bewegliche Balken, rotierende Balken, Wechselfelder und sogar kleine zufällig bewegte Objekte verwendet. Ursprünglich wurde all dies in Matlab mit großartigen Ergebnissen programmiert. Aufgrund der Inkompatibilität mit der Hardware, die den Code letztendlich verwenden wird, wurde das Projekt jedoch auf python übertragen.OpenCV oder Matplotlib für Animation Gebäude?
Ich habe begonnen, das System mit den Matplotlib-Modulen in Python mit einigen guten Ergebnissen zu programmieren. Ich habe die Animationsfunktionen in Matplotlib verwendet, um eine konsistente und flüssige Bewegung von sich schnell bewegenden Objekten zu erzeugen. Als ich jedoch tiefer in die Programmierung mit Matplotlib eintauchte, bemerkte ich ein paar Probleme. Eine ist insbesondere, dass die Flüssigkeitsbewegung der Objekte nicht genau so flüssig war, wie bisher angenommen.
Da ich opencv für einen anderen Teil des Verhaltenssystems verwenden werde, habe ich mich gefragt, ob opencv irgendwelche besonderen Vorteile gegenüber Matplotlib hat, insbesondere in Bezug auf Zeichnungsrate und Animation.
Ich werde im Folgenden ausführlicher gehen.
Hier ist ein Teil meines Skripts zum Erstellen der Animation, beachten Sie, dass diese Version abstürzt und ich habe noch nicht herausgefunden warum.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib.animation as animation
import time
fig = plt.figure()
ax = fig.add_subplot(111)
fig.patch.set_facecolor([0,0,0])
fig.tight_layout()
plt.xlim(-100, 100)
plt.ylim(-100, 100)
plt.axis('off')
# List of variables
width = 1
bars = 20
spacing = 20
step = .01
direction = -1
RB = [] # Establish RB as a Python list
for a in range(bars):
RB.append(patches.Rectangle((a*spacing-200,-100), width, 200,
color=[1,0,0], alpha=0.50))
def init():
for a in range(bars):
ax.add_patch(RB[a])
return RB
def animate(i):
for i in range(bars):
temp = np.array(RB[i].get_xy())
if temp[0] > 200:
temp[0] = -199
elif temp[0] < -200:
temp[0] = 199
else:
temp[0] = temp[0] + step*direction;
RB[i].set_xy(temp)
return RB
t = time.time()
plt.show()
while t < timewidow
anim = animation.FuncAnimation(fig, animate,
init_func=init,
frames=30,
interval=1,
blit=True)
fig.clf()
Code, der funktioniert, ist hier. Es ist nur so, dass sich jedes einzelne Objekt nicht synchron zueinander bewegt.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib.animation as animation
import time
fig = plt.figure()
ax = fig.add_subplot(111)
fig.patch.set_facecolor([0,0,0])
fig.tight_layout()
plt.xlim(-100, 100)
plt.ylim(-100, 100)
plt.axis('off')
# List of variables
width = 1
bars = 20
spacing = 20
step = .01
direction = -1
RB = [] # Establish RB as a Python list
for a in range(bars):
RB.append(patches.Rectangle((a*spacing-200,-100), width, 200,
color=[1,0,0], alpha=0.50))
def init():
for a in range(bars):
ax.add_patch(RB[a])
return RB
def animate(i):
for i in range(bars):
temp = np.array(RB[i].get_xy())
if temp[0] > 200:
temp[0] = -199
elif temp[0] < -200:
temp[0] = 199
else:
temp[0] = temp[0] + step*direction;
RB[i].set_xy(temp)
return RB
anim = animation.FuncAnimation(fig, animate,
init_func=init,
frames=30,
interval=1,
blit=True)
plt.show()
Dachte nicht, über diesen Aspekt, Vielen Dank für den Hinweis it out. Der Zweck der while-Schleife im ersten Code-Satz bestand darin, zu versuchen, die Figur für eine kurze Zeit zu animieren und dann zu stoppen. Allerdings habe ich versucht, den Code in der Reihenfolge plt.show() -> animate -> plt.clf auszuführen. Die Figur würde auftauchen und sofort verschwinden. –
Um die Animation anzuhalten, können Sie 'anim.event_source.stop()' verwenden, siehe [diese Frage] (https://stackoverflow.com/questions/16732379/stop-start-pause-in-python-matplotlib-animation) . Sie können dies mit einem Mausklick oder [einem anderen Timer] auslösen (https://matplotlib.org/examples/event_handling/timers.html) – ImportanceOfBeingErnest