OpenCV vs matplotlib
data format
- both matplotlib and opencv express the image as a numpy array
- you can always manipulate the array directly using matrix math
- or, both matplotlib and opencv provide methods to do sophisticated operations
- there is considerable overlap between the two systems
- you can probably do whatever you want with either system
- and you can mix and match both systems, so long as you know the differences
- in the way they handle the array
color model
- by default, matplotlib uses RGB, opencv uses BGR
alpha channel
- by default, array shape is (y,x,3)
- can be changed to (y,x,4), for RGBA or BGRA
- example:
- y,x,d = myarray.shape
- numpy.dstack(myarray, numpy.zeros(y, x))
display
- by default, matplotlib produces a graph
- - with x,y,z axis, with tickmarks and scale
- - the graph is positioned with margins inside a resizeable window
- opencv gives a full-size image in a fixed-size window
animation
- both systems provide systems for animation and user-input handling
- matplotlib FuncAnimation allows for an incremental blit
- matplotlib allows you to change the data of objects already in the plot
- opencv requires you to rewrite the whole screen
user input
- both systems allow you to wait for a key press
- both systems provide an event-handler for keyboard and mouse events
tiling
- numpy hstack() and vstack() can be used to tile multiple images into one
- in addition, matplotlib uses the Figure→Axes→Plot heirarchy of subplots
how to overlay transparent plot on top of a photo
1. convert plot to image google: convert matplotlib figure to numpy array opencv https: www.autoscripts.net/convert-matplotlib-figure-to-cv2-image /
2. overlay transparent plot on top of image https: docs.opencv.org/3.4/d5/dc4/tutorial_adding_images.html
in cv2, use cv2.inRange() to make a mask use cv2.bitwise_and() to make masked image see ../sk8/visualcortex.py
in matplotlib,
use imshow() twice, where second, top, image has alpha channel
https://stackoverflow.com/questions/49025832/combine-picture-and-plot-with-matplotlib-with-alpha-channel
ax.imshow(bottom, interpolation=None)
ax.imshow(topimg, interpolation=None) # top image must have alpha channel