我有一些提供RTSP视频源的IP摄像机,我知道OpenCV可以通过使用cv2.videoCapture()和类似cap.read()的东西在窗口上的自己的cv2.imshow()函数上显示视频。现在,我正尝试将该视频显示到TKinter图形用户界面窗口中。下面是来自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()。
提前谢谢你!
发布于 2021-05-26 00:18:58
我设法得到一个rtsp流从我的Ip摄像头显示到一个Tkinter图形用户界面使用PIL ImageTk。虽然在我的系统上由于糟糕的编码而有点滞后,但我认为。我建议您使用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, 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库,我在处理帧方面会有更好的结果。
https://stackoverflow.com/questions/64669968
复制相似问题