如何在 tkinter 窗口中打开 cv2 窗口
Posted
技术标签:
【中文标题】如何在 tkinter 窗口中打开 cv2 窗口【英文标题】:How to open the cv2 window inside a tkinter window 【发布时间】:2022-01-22 16:09:11 【问题描述】:我在 Internet 上找到了 this python code,用于计算使用 Open CV 库的人数。我需要在 Tkinter 窗口中打开使用 CV2 打开的窗口,然后添加设置命令。
这是来自 GitHub 的代码:https://github.com/Gupu25/PeopleCounter
如何在 Tkinter 窗口中打开两个 OpenCv 窗口?
【问题讨论】:
您可能需要将NumPy
数组(Python 中OpenCV 的图像对象)转换为tkinter 的图像对象(PhotoImage
),然后在tkinter 窗口上显示此图像。您可以将PIL
图像转换为PhotoImage
s,因此可能的转换链是从NumPy
数组到PIL
到PhotoImage
。检查此链接:***.com/questions/52459277/…
"open inside of" 是不可能的,因为 OpenCV 的 imshow
是它自己的 GUI。 -- 如上所述,您可以在 Tkinter 本身中显示数据/图像/数组。
我之前曾尝试插入一个带有按钮的额外 tkinter 窗口,但只要 tkinter 窗口保持打开状态,计算汽车的视频就不会开始。你能让它打开一个 tkinter 窗口进行设置并在后台让 CV2 窗口运行吗?
不。一次只运行一个 GUI 事件循环。不要尝试同时运行 tkinter 和 imshow。相反,听@stateMachine,使用 tkinter 标签,从 numpy 数组构造一个 PhotoImage,并将其粘贴在标签中。
【参考方案1】:
这是一个使用 OpenCV 的 VideoCapture 对象在 tkinter 窗口中打开视频的最小示例:
from tkinter import NW, Tk, Canvas, PhotoImage
import cv2
def photo_image(img):
h, w = img.shape[:2]
data = f'P6 w h 255 '.encode() + img[..., ::-1].tobytes()
return PhotoImage(width=w, height=h, data=data, format='PPM')
def update():
ret, img = cap.read()
if ret:
photo = photo_image(img)
canvas.create_image(0, 0, image=photo, anchor=NW)
canvas.image = photo
root.after(15, update)
root = Tk()
root.title("Video")
cap = cv2.VideoCapture("video.mp4")
canvas = Canvas(root, width=1200, height=700)
canvas.pack()
update()
root.mainloop()
cap.release()
要显示 2 个 OpenCV 视频,只需进行一些调整,然后使用 np.hstack()
方法或 np.vstack()
方法,具体取决于您希望视频是水平还是垂直并排显示:
from tkinter import NW, Tk, Canvas, PhotoImage
import cv2
import numpy as np
def photo_image(img):
h, w = img.shape[:2]
data = f'P6 w h 255 '.encode() + img[..., ::-1].tobytes()
return PhotoImage(width=w, height=h, data=data, format='PPM')
def update():
ret1, img1 = cap1.read()
ret2, img2 = cap2.read()
if ret1:
photo = photo_image(np.hstack((img1, img2)))
canvas.create_image(0, 0, image=photo, anchor=NW)
canvas.image = photo
root.after(15, update)
root = Tk()
root.title("Video")
cap1 = cv2.VideoCapture("video1.mp4")
cap2 = cv2.VideoCapture("video2.mp4")
canvas = Canvas(root, width=1200, height=700)
canvas.pack()
update()
root.mainloop()
cap.release()
【讨论】:
以上是关于如何在 tkinter 窗口中打开 cv2 窗口的主要内容,如果未能解决你的问题,请参考以下文章
在 Python Tkinter 中,如何在 mainloop 窗口打开后运行代码? [复制]