Можно ли добавить в Tkinter изображение с вебкамеры?
Имеется окно Tkinter и камера cv2, при запуске кода, сначала открывается окно с камерой, а после его закрытия уже появляется окно Tkinter. Можно ли как-то объединить эти окна так, чтобы изображние с камеры было внутри окна tkinter как картинка, но чтобы при этом изображение двигалось?
from tkinter import *
import cv2
screen = Tk()
screen.title("Полноэкранное окно с камерой")
screen.attributes('-fullscreen', 1)
screen['bg'] = '#000000'
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
cv2.imshow("s", img)
if cv2.waitKey(10) == 27:
break
cap.release()
cv2.destroyAllWindows()
screen.mainloop()
Ответы (1 шт):
посмотри тут. работает.
https://solarianprogrammer.com/2018/04/21/python-opencv-show-video-tkinter-window/
только учти изображение повернуто, для зеркального отображения добавь
frame = cv2.flip(frame,1)
по просьбам полный текст. слямзено - см ссылку.
class App:
def __init__(self, window, window_title, video_source=0):
self.window = window
self.window.title(window_title)
self.video_source = video_source
# open video source (by default this will try to open the computer
webcam)
self.vid = MyVideoCapture(self.video_source)
# Create a canvas that can fit the above video source size
self.canvas = tkinter.Canvas(window, width = self.vid.width, height = self.vid.height)
self.canvas.pack()
# After it is called once, the update method will be automatically called every delay milliseconds
self.delay = 15
self.update()
self.window.mainloop()
class MyVideoCapture:
def __init__(self, video_source=0):
# Open the video source
self.vid = cv2.VideoCapture(video_source)
if not self.vid.isOpened():
raise ValueError("Unable to open video source", video_source)
# Get video source width and height
self.width = self.vid.get(cv2.CAP_PROP_FRAME_WIDTH)
self.height = self.vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
def get_frame(self):
if self.vid.isOpened():
ret, frame = self.vid.read()
if ret:
# Return a boolean success flag and the current frame converted to BGR
return (ret, cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
else:
return (ret, None)
else:
return (ret, None)
в общем так- делаем окно, в нем объект типа Canvas с камеры через cv2 захватываем видео и в объект помещаем как картинку. обновляем. повторить пока не надоест ))) вызов a = APP(tkinter.tk(), 'имя окна') может чего и не до конца перенес - см ссылку - я сам по этому примеру разбирался.