Getting frame from webcam using opencv, then plotting it. I draw a rectangle in the center of the plot, and then get the selected area and show in another plot (enlarged by interpolation)
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import cv2
boxSize = 150
enlargeBy = 3
def getBoxCoordinates(cap, size):
width = cap.get(3)
height = cap.get(4)
x1 = int(width / 2) - int(size / 2)
y1 = int(height / 2) - int(size / 2)
x2 = int(width / 2) + int(size / 2)
y2 = int(height / 2) + int(size / 2)
return [(x1, y1), (x2, y2)]
def getBox(cap, boxSize, frame, enlargeBy):
[(x1, y1), (x2, y2)] = getBoxCoordinates(cap, boxSize);
# Get pixels in box
box_img = frame[y1 + 1:y2, x1 + 1:x2] # +1 cuz it excludes initial pixel interval
return cv2.resize(box_img, None, fx=enlargeBy, fy=enlargeBy,
interpolation=cv2.INTER_LINEAR) # different interpolation methods
cap = cv2.VideoCapture(0);
ret, frame = cap.read()
figWidth = 20
figHeight = 8
fig = plt.figure(figsize=(figWidth, figHeight))
enlarged = getBox(cap, boxSize, frame, enlargeBy)
[(x1, y1), (x2, y2)] = getBoxCoordinates(cap, boxSize);
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), lineType=1)
video_plot = plt.subplot2grid((figHeight, figWidth), (0, 0), colspan=4, rowspan=4)
video_plot.axis('off')
video_plot.set_title("Camera feed")
video = video_plot.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
box_plot = plt.subplot2grid((figHeight, figWidth), (0, 4), colspan=4, rowspan=4)
box_plot.axis('off')
box_plot.set_title("Box")
box = box_plot.imshow(cv2.cvtColor(enlarged, cv2.COLOR_BGR2RGB)) #frame just to start
def updatefig(i):
ret, frame = cap.read()
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), lineType=1)
enlarged = getBox(cap, boxSize, frame, enlargeBy)
video.set_data(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
box.set_data(cv2.cvtColor(enlarged, cv2.COLOR_BGR2RGB))
return [video, box]
ani = animation.FuncAnimation(fig, updatefig, interval=20, frames=200, blit=True)
plt.tight_layout()
plt.show()
cv2.destroyAllWindows()
plt.show()
The weird problem I'm having is that the rectangle that I'm drawing on the frame isn't showing properly: it only shows one or a few of the sides. I've noticed that this changes when the figure dimensions change, e.g. with the code above it shows me the bottom and left sides only, if I change:
figWidth = 10
then I see the bottom, right and top but not the left.
No idea what can exactly is causing this and how to fix.

