TLDRI 正在用 tkinter 和 cv2 编写视频录像机。如何将 tkimage 原始数据传递给 cv2.VideoWriter、cv2.circle 等?当前方法我使用 numpy 数组 (self.data) 作为中间人。...
我正在用 tkinter 和 cv2 编写视频录制器。如何将 tkimage 原始数据传递给 cv2.VideoWriter、cv2.circle 等?
我使用 numpy 数组 ( self.data
) 作为中间人。但这样我每次都需要创建一个新的 tkimage。因此,创建一次后,我想直接使用 cv2 函数访问 tkimage 数据。以下类封装了 tkimage 和 numpy 数组:
import cv2
import numpy as np
// import tkinter as tk
// from tkinter import Canvas
from PIL import Image, ImageTk
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)
写入self.data:
cv2.circle(self.bitmap.data, (x, y), 5, (255, 255, 255), 1, cv2.LINE_AA)
写入视频文件:
// self.recorder = cv2.VideoWriter()
self.recorder.write(self.bitmap.data)
使用 self.image 更新 tkinter ui:
// self._image = ImageTk.PhotoImage(image=Image.fromarray(self.data))
id, image = self.bitmap.image
self.canvas.itemconfig(id, image=image)
那么,如何直接向 tkinter.image 写入数据?