TLDR
I am writing a video recorder with tkinter and cv2. How to pass tkimage raw data to cv2.VideoWriter, cv2.circle, and so on?
Current approach
I using a numpy array (self.data
) as a middle man. But this way I need to create a new tkimage each time. So, after creating it once, I want to access tkimage data directly with cv2 functions. The following class encapsulates tkimage and the numpy array:
class Bitmap:
def __init__(self, size=(512, 512)):
self.data = np.zeros((size[1], size[0], 3), dtype=np.uint8)
self._image_id = 0
self._image = None
@property
def size(self):
return (self.data.shape[1], self.data.shape[0])
@property
def width(self):
return self.data.shape[1]
@property
def height(self):
return self.data.shape[0]
@property
def clear(self):
self.data.fill(0)
def new_image(self):
self._image = ImageTk.PhotoImage(image=Image.fromarray(self.data))
return self._image_id, self._image
@property
def image(self):
return self._image_id, self._image
def setup(self, canvas):
self._image = ImageTk.PhotoImage(image=Image.fromarray(self.data))
self._image_id = canvas.create_image(0, 0, anchor=tk.NW, image=self._image)
Write to self.data:
cv2.circle(self.bitmap.data, (x, y), 5, (255, 255, 255), 1, cv2.LINE_AA)
Write to video file:
// self.recorder = cv2.VideoWriter()
self.recorder.write(self.bitmap.data)
Use self.image to update tkinter ui:
// self._image = ImageTk.PhotoImage(image=Image.fromarray(self.data))
id, image = self.bitmap.image
self.canvas.itemconfig(id, image=image)
So, how to write direcly to tkinter.image data?