2016-08-04 24 views
0

tkinterで(ストリームからではなく)ビデオフレームを表示しようとしています。次のステップは、ユーザがビデオ内でフレームを前後に移動させるためのボタンです。私はPythonでプログラミングするのは全く新しいことを言わなければならない。pythonでtkinterでビデオファイル(画像)のフレームを表示するには

Pythonのスニペット: だから最初、私は以下の記事を読んで画像に変換するビデオhttp://srand.fr/blog/python%20import%20video.html

Tkinterの光画像クラス:http://effbot.org/tkinterbook/photoimage.htm

問題は、私はImageIOにして変換された画像を使用することができないということですかVideoFileClipをクリックすると、tkinterの写真画像が表示されます。次のエラーが表示されます。

_tkinter.TclError: image "[[ …(some numbers)… ]]" doesn't exist 

ここに私の簡単なコードがあります。私はあなたが私を助けることができると思います:)

from moviepy.editor import VideoFileClip 
from tkinter import * 
import pylab 

vid =VideoFileClip("example.mp4") 

window = Tk() 
window.title("Choose Frame") 
window.geometry ("900x600") 

count =20 

photo = vid.get_frame(count) 
label =Label(window, image = photo) 
label.pack() 

他のコード、同じ問題:

import imageio 
from tkinter import * 
import pylab 

filename = './example.mp4' 
vid = imageio.get_reader(filename, 'ffmpeg') 

window = Tk() 
window.title("Choose Frame") 
window.geometry ("900x600") 

count =20 

photo = vid.get_data(count) 
label =Label(window, image = photo) 
label.pack() 

答えて

1

これは少し遅く決してよりよい遅いです。

ここでは、私が見つけて少し修正した実際の例ですが、これは '.mp4'、動画では動作しますが、 '.flv'では動作しません。理由はわかりません。

注:

のpython 2.7輸入のTkinter

のpython 3輸入のTkinter

import Tkinter as tk 
import threading 
import imageio 
from PIL import Image, ImageTk 

video_name = "test_video.mp4" #This is your video file path 
video = imageio.get_reader(video_name) 

def stream(label): 

    frame = 0 
    for image in video.iter_data(): 
     frame += 1         #counter to save new frame number 
     image_frame = Image.fromarray(image)   
     image_frame.save('FRAMES/frame_%d.png' % frame)  #if you need the frame you can save each frame to hd 
     frame_image = ImageTk.PhotoImage(image_frame) 
     label.config(image=frame_image) 
     label.image = frame_image 
     if frame == 40: break       #after 40 frames stop, or remove this line for the entire video 

if __name__ == "__main__": 

    root = tk.Tk() 
    my_label = tk.Label(root) 
    my_label.pack() 
    thread = threading.Thread(target=stream, args=(my_label,)) 
    thread.daemon = 1 
    thread.start() 
    root.mainloop() 
0

そして、ここでは、私はTkinterのを作るしようとしていたプレーヤーといくつかのサンプルの他の素敵な実施例でありますOpencvモジュールのコード。 これは単なる例であり、決してコードを完成させるものではありません。

import cv2 
from Tkinter import * 
from PIL import Image, ImageTk 
import io 
import threading 
import os, sys 

def resize(image): 
    im = image 
    new_siz = siz 
    im.thumbnail(new_siz, Image.ANTIALIAS) 
    return im 

def size(event): 
    global siz 
    if siz == screenWH: 
     siz = (200, 200) 
    else: 
     siz = screenWH 
     win.state('zoomed') 
    print 'size is: ', siz 

def view_frame_video(): 
    vc = cv2.VideoCapture('test_video.flv') 
    if vc.isOpened(): 
     rval , frame = vc.read() 
    else: 
     rval = False 

    while rval: 
     rval, frame = vc.read() 
     img =Image.fromarray(frame) 
     img = resize(img) 
     imgtk = ImageTk.PhotoImage(img) 
     lbl.config(image=imgtk) 
     lbl.img = imgtk 
     if stop == True: 
      vc.release() 
      break  #stop the loop thus stops updating the label and reading imagge frames 
     cv2.waitKey(1) 
    vc.release() 

def stop_(): 
    global stop 
    stop = True 

def play(): 
    stop = False 
    t = threading.Thread(target=view_frame_video) 
    t.start() 



win = Tk() 

stop = None 
screenWH = (win.winfo_screenwidth(), win.winfo_screenheight()) 
siz = (200, 200) 

Label(text='Press Play Button').pack() 
frm_ = Frame(bg='black') 
frm_.pack() 
lbl = Label(frm_, bg='black') 
lbl.pack(expand=True) 
lbl.bind('<Double-Button-1>', size) 

frm = Frame() 
frm.pack() 
Button(text='Play', command = play).pack(side=LEFT) 
Button(text='Stop', command = stop_).pack(side=LEFT) 

win.mainloop() 
関連する問題