首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenCV将RTSP视频流传输到Tkinter帧

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

Stack Overflow用户
提问于 2020-11-04 04:13:41
回答 1查看 431关注 0票数 0

我有一些提供RTSP视频源的IP摄像机,我知道OpenCV可以通过使用cv2.videoCapture()和类似cap.read()的东西在窗口上的自己的cv2.imshow()函数上显示视频。现在,我正尝试将该视频显示到TKinter图形用户界面窗口中。下面是来自OpenCV网站的RTSP示例代码,它在一个独立窗口上工作得很好:

代码语言:javascript
复制
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()

提前谢谢你!

EN

回答 1

Stack Overflow用户

发布于 2021-05-26 00:18:58

我设法得到一个rtsp流从我的Ip摄像头显示到一个Tkinter图形用户界面使用PIL ImageTk。虽然在我的系统上由于糟糕的编码而有点滞后,但我认为。我建议您使用cv2.VideoCapture在不同的线程上运行处理,因为它有时会扰乱GUI。

代码语言:javascript
复制
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, 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库,我在处理帧方面会有更好的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64669968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档