Помощь с cv2 работой видео в python

MamblDie

Новичок
Пользователь
Апр 20, 2020
1
0
1
Дали задание научится работать с видео в Python . Нужно запускать видео с камеры или с компьютера и проводить над ним разные геометрические или цветовые преобразования в режиме реального времени . Такие как вертикальный сдвиг , цвет видео должен становится серым , sobel и фильтр преобразования в рельефное .
То есть пользователь запустил видео или свою веб камеру и мог нажимать кнопки и изображение менялось . Проблема в том что я не могу сделать изменение видео в режиме реального времени . Код который готов на данный момент прикрепил
Python:
from tkinter import *
import cv2 as cv
import numpy as np
from tkinter.filedialog import askopenfile
from tkinter import messagebox
import PIL.Image, PIL.ImageTk
import time

class Application(Frame):
    def __init__(self, root):
        super(Application, self).__init__(root)
        self.root = root
        self.widgets()
        self.delay = 15
        self.canwidth = 850
        self.canhight = 450



    def widgets(self):
       #----------transformations----------
        self.btn1 = Button(text = 'Gray',fg = 'white',bg = 'black',padx = '20',pady = '10')
        self.btn1.place(x = '50',y = '50')

        self.btn2 = Button(text = 'Sobel',fg = 'white',bg = 'black',padx = '20',pady = '10')
        self.btn2.place(x = '50',y = '120')

        self.btn3 = Button(text = 'Сдвиг',fg = 'white',bg = 'black',padx = '20',pady = '10')
        self.btn3.place(x = '50',y = '190')
        self.btn4 = Button(text = 'Рельеф',fg = 'white',bg = 'black',padx = '20',pady = '10')
        self.btn4.place(x = '50',y = '260')
        #----------VIDEO-------------

        self.btn5 = Button(text = 'Файл',fg = 'white',bg = 'black',padx = '20',pady = '10', command = self.video)
        self.btn5.place(x = '50',y = '480')
        self.btn6 = Button(text = 'Камера',fg = 'white',bg = 'black',padx = '20',pady = '10', command = self.start_webcam )
        self.btn6.place(x = '150',y = '480')
        #------------Canvas---------------
        self.canvas = Canvas(root, width = 850 ,height = 450,bg = 'blue')
        self.canvas.place(x ='200',y = '1')

    def start_video(self):
        self.ret,self.frame = self.vid.read()
        if self.ret:
            self.frame = cv.cvtColor(self.frame, cv.COLOR_BGR2RGB)
            self.frame = cv.flip(self.frame,1)
            self.frame = cv.resize(self.frame,(self.canwidth,self.canhight))
            self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(self.frame))
            self.canvas.create_image(1, 1, image = self.photo, anchor="nw")
        self.root.after(self.delay, self.start_video)

    def start_webcam(self):
        self.vid = cv.VideoCapture(0)
        self.start_video()

    def open_file(self):
        fopen = askopenfile(mode='rb', defaultextension=".mp4", filetypes=(("Video files", ".mp4"), ("All files", ".*")))
        if fopen == None: return
        else:
            self.vid = cv.VideoCapture(fopen.name)

    def video(self):
        self.open_file()
        self.start_video()

    
    



root = Tk()
root.title("Variant 2")
root.geometry('1100x550')
root.resizable(False, False)
app = Application(root)
root.mainloop()
 

Вложения

  • Новый текстовый документ (2).txt
    2,7 КБ · Просмотры: 2
Последнее редактирование модератором:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример наложения простых фильтров на видео:
Python:
from tkinter import Button, Canvas, Frame, Tk
import cv2 as cv
import numpy as np
from tkinter.filedialog import askopenfile
from PIL import Image, ImageTk


class Application(Frame):
    def __init__(self, root):
        super(Application, self).__init__(root)
        self.root = root
        self.widgets()
        self.delay = 15
        self.canwidth = 850
        self.canhight = 450
        self.gray = False
        self.rotate = False
        self.neg = False
        self.sobel = False

    def widgets(self):

        # ----------transformations----------
        self.btn1 = Button(text='Gray',
                           fg='white',
                           bg='black',
                           padx='20',
                           pady='10',
                           command=lambda: self.reverve_value('gray'))
        self.btn1.place(x='50', y='50')

        self.btn2 = Button(text='Sobel',
                           fg='white',
                           bg='black',
                           padx='20',
                           pady='10',
                           command=lambda: self.reverve_value('sobel'))
        self.btn2.place(x='50', y='120')

        self.btn3 = Button(text='Rotate',
                           fg='white',
                           bg='black',
                           padx='20',
                           pady='10',
                           command=lambda: self.reverve_value('rotate'))
        self.btn3.place(x='50', y='190')
        self.btn4 = Button(text='Negative',
                           fg='white',
                           bg='black',
                           padx='20',
                           pady='10',
                           command=lambda: self.reverve_value('neg'))
        self.btn4.place(x='50', y='260')
        # ----------VIDEO-------------

        self.btn5 = Button(text='Файл',
                           fg='white',
                           bg='black',
                           padx='20',
                           pady='10',
                           command=self.video)
        self.btn5.place(x='50', y='480')
        self.btn6 = Button(text='Камера',
                           fg='white',
                           bg='black',
                           padx='20',
                           pady='10',
                           command=self.start_webcam)
        self.btn6.place(x='150', y='480')
        # ------------Canvas---------------
        self.canvas = Canvas(root, width=850, height=450, bg='blue')
        self.canvas.place(x='200', y='1')

    def reverve_value(self, x):
        setattr(self, x, not getattr(self, x))

    def start_video(self):
        self.ret, self.frame = self.vid.read()
        if self.ret:
            if self.gray:
                self.frame = cv.cvtColor(self.frame, cv.COLOR_BGR2GRAY)
            else:
                self.frame = cv.cvtColor(self.frame, cv.COLOR_BGR2RGB)

            if self.rotate:
                self.frame = cv.flip(self.frame, 0)

            if self.neg:
                self.frame = cv.bitwise_not(self.frame)

            if self.sobel:
                self.frame = np.uint8(cv.Laplacian(self.frame, cv.CV_64F))

            self.frame = cv.resize(self.frame, (self.canwidth, self.canhight))
            self.photo = ImageTk.PhotoImage(
                image=Image.fromarray(self.frame)
            )
            self.canvas.create_image(1, 1, image=self.photo, anchor="nw")
        self.root.after(self.delay, self.start_video)

    def start_webcam(self):
        self.vid = cv.VideoCapture(0)
        self.start_video()

    def open_file(self):
        fopen = askopenfile(mode='rb',
                            defaultextension=".mp4",
                            filetypes=(
                                ("Video files", ".mp4"),
                                ("All files", ".*")
                            ))
        if fopen is None:
            return
        else:
            self.vid = cv.VideoCapture(fopen.name)

    def video(self):
        self.open_file()
        self.start_video()


root = Tk()
root.title("Variant 2")
root.geometry('1100x550')
root.resizable(False, False)
app = Application(root)
root.mainloop()
 

Форум IT Специалистов