如何在 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 图像转换为PhotoImages,因此可能的转换链是从NumPy 数组到PILPhotoImage。检查此链接:***.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 窗口打开后运行代码? [复制]

如何同时打开 Pygame 窗口和 Tkinter 窗口?

如何指定 Tkinter 窗口的打开位置?

Tkinter 用窗口打开控制台窗口

如何在没有按钮的情况下关闭tkinter窗口而不完全关闭Python?

如何使用 TKinter 创建软件加载窗口?