Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
650 views
in Technique[技术] by (71.8m points)

python - to show video streaming inside frame in tkinter

I'm trying to display my live video inside my frame1. I want to know why it's not working as in cv2.imshow I have written frame1. Can anyone help me out Please?

my code of my frame/window :

from tkinter import Tk, Text, BOTH, W, N, E, S
from tkinter.ttk import Frame, Button, Label, Style
from tkinter import *

# from tkinter import *

class Example(Frame):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.master.title("Nav Track app")
        self.pack(fill=BOTH, expand=True)

        self.style = Style()
        self.style.theme_use("clam")

        self.columnconfigure(1, weight=1)
        self.columnconfigure(3, pad=7)
        self.rowconfigure(4, weight=1)
        self.rowconfigure(8, pad=7)

        lbl = Label(self, text="Keep your eyes on screen")
        lbl.grid(sticky=W, pady=4, padx=5)

        frame1 = Frame(self, bg="")
        frame1.grid(row=1, column=0, columnspan=2, rowspan=6, padx=8, sticky=E + W + S + N)

        # area = Text(self)
        # area.grid(row=1, column=0, columnspan=2, rowspan=6, padx=8, sticky=E + W + S + N)

        self.button = Button(self, text="Start Camera", command=hello)
        self.button.grid(row=1, column=3, padx=4)


        cbtn = Button(self, text="Select Object")
        cbtn.grid(row=2, column=3, padx=4, pady=4)


        dbtn = Button(self, text="Play")
        dbtn.grid(row=3, column=3, padx=4, pady=4)

        ebtn = Button(self, text="Start Tracking")
        ebtn.grid(row=4, column=3, padx=4, pady=4)

        fbtn = Button(self, text="Start Recording")
        fbtn.grid(row=5, column=3, padx=4, pady=4)

        fbtn = Button(self, text="Take Snapshots")
        fbtn.grid(row=6, column=3, padx=4, pady=4)

        hbtn = Button(self, text="Help")
        hbtn.grid(row=9, column=0, padx=5, pady=6)

        obtn = Button(self, text="Exit")
        obtn.grid(row=9, column=3, pady=6)

Function for video streaming in OpenCV:

def hello():
    import cv2

    # Create a VideoCapture object
    cap = cv2.VideoCapture(0)

    # Check if camera opened successfully
    if (cap.isOpened() == False):
        print("Unable to read camera feed")

    # Default resolutions of the frame are obtained.The default resolutions are system dependent.
    # We convert the resolutions from float to integer.
    # frame_width = int(cap.get(3))
    # frame_height = int(cap.get(4))
    frame_width = int(cap.set(3, 1280))
    frame_height = int(cap.set(4, 1024))
    frameyowidth = int(cap.get(3))
    frameyoheight = int(cap.get(4))

    # Define the codec and create VideoWriter object.The output is stored in 'outpy.avi' file.
    out = cv2.VideoWriter('outpy.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (frameyowidth, frameyoheight))

    while (True):
        ret, frame = cap.read()

        if ret == True:

            # Write the frame into the file 'output.avi'
            out.write(frame)

            # Display the resulting frame
            cv2.imshow("chdh", frame1)

            # Press Q on keyboard to stop recording
            if cv2.waitKey(1) & 0xFF == 27:
                break

        # Break the loop
        else:
            break

        # When everything done, release the video capture and video write objects
    cap.release()
    out.release()

    # Closes all the frames
    cv2.destroyAllWindows()

and if there is another alternative way to do so but it must be the easiest one, please.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

To show video streaming inside frame in tkinter, I feel the easiest way is using PIL library....

from Tkinter import *
from PIL import ImageTk, Image
import cv2


root = Tk()
# Create a frame
app = Frame(root, bg="white")
app.grid()
# Create a label in the frame
lmain = Label(app)
lmain.grid()

# Capture from camera
cap = cv2.VideoCapture(0)

# function for video streaming
def video_stream():
    _, frame = cap.read()
    cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
    img = Image.fromarray(cv2image)
    imgtk = ImageTk.PhotoImage(image=img)
    lmain.imgtk = imgtk
    lmain.configure(image=imgtk)
    lmain.after(1, video_stream) 

video_stream()
root.mainloop()

You can install PIL using pip -

pip install Pillow

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...