обновить рамку в matplotlib с предварительным просмотром камеры

Я новичок в Python и Matplotlib. Мой компьютер подключен к двум USB-камерам, и я намерен использовать подзаголовок (1,2,1) и подзаголовок (1,2,2) в matplotlib для построения кадров из двух камер во временных рядах. Когда я делаю это с помощью своего кода, я либо рисую только один кадр, либо получаю черный экран в области графика.

Мой код выглядит ниже

#import import cv2 import matplotlib.pyplot as plt #Initiate the two cameras cap1 = cv2.VideoCapture(0) cap2 = cv2.VideoCapture(1) #Capture the frames from camera 1 and 2 and display them over time using matplotlib while True: #grab frame from camera 1 and 2 ret1,frame1 = cap1.read() ret2,frame2 = cap2.read() plt.subplot(1,2,1), plt.imshow(cv2.cvtColor(frame1,cv2.COLOR_BGR2RGB)) plt.subplot(1,2,2), plt.imshow(cv2.cvtColor(frame2,cv2.COLOR_BGR2RGB)) #draw the plot plt.show(False) #Result is black screen. If plt.show() is called, I see the frames but then it freezes. 

One Solution collect form web for “обновить рамку в matplotlib с предварительным просмотром камеры”

Интерактивный режим

Одним из способов обновления графика в matplotlib является использование интерактивного режима ( plt.ion() ). Затем вы не должны воссоздавать новые подзаголовки для каждого захваченного вами кадра, но создавайте свой сюжет с изображениями один раз и обновляйте его впоследствии.

 import cv2 import matplotlib.pyplot as plt def grab_frame(cap): ret,frame = cap.read() return cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) #Initiate the two cameras cap1 = cv2.VideoCapture(0) cap2 = cv2.VideoCapture(1) #create two subplots ax1 = plt.subplot(1,2,1) ax2 = plt.subplot(1,2,2) #create two image plots im1 = ax1.imshow(grab_frame(cap1)) im2 = ax2.imshow(grab_frame(cap2)) plt.ion() while True: im1.set_data(grab_frame(cap1)) im2.set_data(grab_frame(cap2)) plt.pause(0.2) plt.ioff() # due to infinite loop, this gets never called. plt.show() 

FuncAnimation

Другим вариантом является, конечно, использование matplotlib, встроенного в FuncAnimation которое специально предназначено для анимации графиков.

 import cv2 import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation def grab_frame(cap): ret,frame = cap.read() return cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) #Initiate the two cameras cap1 = cv2.VideoCapture(0) cap2 = cv2.VideoCapture(1) #create two subplots ax1 = plt.subplot(1,2,1) ax2 = plt.subplot(1,2,2) #create two image plots im1 = ax1.imshow(grab_frame(cap1)) im2 = ax2.imshow(grab_frame(cap2)) def update(i): im1.set_data(grab_frame(cap1)) im2.set_data(grab_frame(cap2)) ani = FuncAnimation(plt.gcf(), update, interval=200) plt.show() 

Чтобы закрыть окно на событии нажатия клавиши, вы можете добавить обратный вызов, например

 #... other code ani = FuncAnimation(plt.gcf(), update, interval=200) def close(event): if event.key == 'q': plt.close(event.canvas.figure) cid = plt.gcf().canvas.mpl_connect("key_press_event", close) plt.show() # code that should be executed after window is closed. 
Python - лучший язык программирования в мире.