Combinación de cv2.imshow () con matplotlib plt.show () en tiempo real

Estoy tratando de combinar una fuente de la cámara web con openCV y luego actualizar una gráfica con matplotlib.

Para obtener y mostrar los cuadros un ejemplo básico:

import cv2 cap = cv2.VideoCapture(0) while(True): # Capture frame-by-frame ret, frame = cap.read() # Display the resulting frame cv2.imshow('frame',frame) # When to exit loop - terminate program if cv2.waitKey(1) & 0xFF == ord('q'): break # When everything done, release the capture cap.release() cv2.destroyAllWindows() 

Un ejemplo de actualización continua de un gráfico (trazado aleatorio) con matplotlib:

 import numpy as np import matplotlib.pyplot as plt x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] y = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # x goes from 0-9 numbers # y goes from 0-100% fig = plt.figure() ax = plt.axes(xlim=(0, 9), ylim=(0, 100)) # line, = ax.plot([], [], lw=2) rects = plt.bar(x, y, color='b') def animate(i): y = random.sample(xrange(100), 10) for rect, yi in zip(rects, y): rect.set_height(yi) return rects anim = animation.FuncAnimation(fig, animate, frames=200, interval=20, blit=True) plt.show() 

Así que lo que quiero es combinar los dos juntos. El gráfico debe actualizarse pasando los resultados que obtengo de los marcos. El principal problema al que me enfrento es lograr que ambas ventanas se actualicen simultáneamente una al lado de la otra. El plt.show () parece estar bloqueando todo lo demás.

¿Alguna idea sobre cómo resolver?

Aclamaciones

Aquí hay un ejemplo de plt.figure() convertir un plt.figure() a np.array y mostrarlo a lo largo de la alimentación de la cámara con cv2.imshow

 import matplotlib matplotlib.use('TkAgg') import numpy as np import cv2 import matplotlib.pyplot as plt fig = plt.figure() cap = cv2.VideoCapture(0) x1 = np.linspace(0.0, 5.0) x2 = np.linspace(0.0, 2.0) y1 = np.cos(2 * np.pi * x1) * np.exp(-x1) y2 = np.cos(2 * np.pi * x2) line1, = plt.plot(x1, y1, 'ko-') # so that we can update data later for i in range(1000): # update data line1.set_ydata(np.cos(2 * np.pi * (x1+i*3.14/2) ) * np.exp(-x1) ) # redraw the canvas fig.canvas.draw() # convert canvas to image img = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='') img = img.reshape(fig.canvas.get_width_height()[::-1] + (3,)) # img is rgb, convert to opencv's default bgr img = cv2.cvtColor(img,cv2.COLOR_RGB2BGR) # display image with opencv or any operation you like cv2.imshow("plot",img) # display camera feed ret,frame = cap.read() cv2.imshow("cam",frame) k = cv2.waitKey(33) & 0xFF if k == 27: break