使用OpenCV将RTSP视频流传输到Tkinter帧

如何解决使用OpenCV将RTSP视频流传输到Tkinter帧

我有一些提供RTSP视频馈送的IP摄像机,并且我知道OpenCV可以通过使用cv2.imshow()和类似cv2.videoCapture()的窗口在其自己的cap.read()函数显示视频。现在,我试图将视频显示到TKinter GUI窗口上。我下面的内容是来自OpenCV网站的RTSP示例代码,该代码在独立的窗口中效果很好:

import cv2
cap = cv2.VideoCapture('rtsp://192.168.0.169:554/mpeg4')
while True:
    ret,img = cap.read()
    if ret == True:  #lines below may not be necessary
        cv2.imshow('video output',img)
        k = cv2.waitKey(10)& 0xff
        if k == 27:
            break
cap.release()
cv2.destroyAllWindows()

如何将视频供稿应用于TKinter.Frame()或类似内容?另外,我将在同一界面窗口上总共使用3个摄像头,并添加按钮以将摄像头供稿切换到其他TKinter.Frame()

提前谢谢!

解决方法

我设法使用 PIL ImageTk 将 rtsp 流从 Ip cam 显示到 Tkinter GUI。虽然我认为由于编码错误,它在我的系统上有点滞后。我建议您在不同的线程上使用 cv2.VideoCapture 运行处理,因为它有时会冻结 GUI。

import tkinter as tk 

import cv2  
from PIL import Image
from PIL import ImageTk
import threading
import os

class MainWindow():
    def __init__(self,window,cap):
        self.window = window
        self.cap = cap
        self.width = self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)
        self.height = self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
        self.interval = 10 # Interval in ms to get the latest frame
        # Create canvas for image
        self.canvas = tk.Canvas(self.window,width=600,height=400)
        self.canvas.grid(row=0,column=0)
        # Update image on canvas
        root.after(self.interval,self.update_image)
        self.button = tk.Button()

    def update_image(self):    
        # Get the latest frame and convert image format
        self.OGimage = cv2.cvtColor(self.cap.read()[1],cv2.COLOR_BGR2RGB) # to RGB
        self.OGimage = Image.fromarray(self.OGimage) # to PIL format
        self.image = self.OGimage.resize((600,400),Image.ANTIALIAS)
        self.image = ImageTk.PhotoImage(self.image) # to ImageTk format
        # Update image
        self.canvas.create_image(0,anchor=tk.NW,image=self.image)
        # Repeat every 'interval' ms
        self.window.after(self.interval,self.update_image)

#def run_decoding(): 
    #os.system("ffmpeg -i rtsp://192.168.1.10?tcp -codec copy -f mpegts udp://127.0.0.1:5000 &")


if __name__ == "__main__":
    #my_cam = ONVIFCamera('192.168.1.10',80,'gemer.daniel@gmail.com','dg24111998')
    #media = my_cam.create_media_service()
    #ptz = my_cam.create_ptz_service()
    #media_profile = media.GetProfiles()[0]

    # Get PTZ configuration options for getting continuous move range
    #request = ptz.create_type('GetConfigurationOptions')
    #request.ConfigurationToken = media_profile.token
    #ptz_configuration_options = ptz.GetConfigurationOptions(request)

    #request = ptz.create_type('ContinuousMove')
    #request.ProfileToken = media_profile._token

    #ptz.Stop({'ProfileToken': media_profile._token})
    #p1 = threading.Thread(target=run_decoding)
    #p1.start()
    root = tk.Tk()
    MainWindow(root,cv2.VideoCapture("rtsp://192.168.1.10?tcp"))
    root.mainloop()

另外,如果你限制使用 Tkinted,你可以尝试 PyQT5 库,我在处理帧方面有更好的结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?