2015-04-23 1 views
0

Я пытаюсь изменить размер вывода своей веб-камеры, чтобы вписаться в ярлык, но я не мог заставить его работать. Если вы решили попробовать и протестировать код, я поместил синий ярлык в ярлык в качестве руководства по тому, насколько велика вам потребуется изменить размер вывода веб-камеры.Python Tkinter OpenCV PIL image resize to fit label

Код:

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

isrunning = 0 

def start(): 
    global isrunning 
    if isrunning == 0: 
     global cap 
     cap = cv2.VideoCapture(0) 
     isrunning = 1 
     lmain.grid(row = 1,column = 1) 
     def show_frame(): 
      _, frame = cap.read() 
      frame = cv2.flip(frame, 1) 
      cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) 
      img = Image.fromarray(cv2image) 
      imgtk = ImageTk.PhotoImage(image=img) 
      lmain.imgtk = imgtk 
      lmain.configure(image=imgtk) 
      if isrunning == 1: 
       lmain.after(10, show_frame) 
    show_frame() 

def Stop(): 
    global isrunning 
    isrunning = 0 
    lmain.grid_forget() 

def main(): 
    Stop() 
    Reset.invoke() 
    stopFunc.invoke() 

root = Tk() 
lmain = Label(root, width = 800, height = 600, bg = "blue") 
stopFunc = Button(root, text = "stop", command = Stop) 
Reset = Button(root, text = "Reset", command = start) 
Main = Button(root, text = "Stop", command = main) 
Start = Button(root, text = "Start", command = start) 
Start.grid(row = 0, column = 0) 
Main.grid(row = 0, column = 1) 

root.mainloop() 
+0

Что вы попробовали, это не сработало? – TigerhawkT3

+0

Я пробовал изменять размер выходных данных веб-камеры так же, как размер метки. –

+0

Изменение размера выхода веб-камеры - это цель, а не то, что вы пробовали. Я ничего не вижу в вашем коде, который, похоже, относится к изменению размера изображения. «Вот мой код, исправьте его» - отличный способ задать вопрос о SO. – TigerhawkT3

ответ

0

Я попробовал ваш код, и я изменить код здесь:

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

isrunning = 0 

def start(): 
    global isrunning 
    if isrunning == 0: 
     global cap 
     cap = cv2.VideoCapture(0) 
     isrunning = 1 
     lmain.grid(row = 1,column = 1) 
     def show_frame(): 
      _, frame = cap.read() 
      frame = cv2.flip(frame, 1) 
      frame = cv2.resize(frame, (800,600)) 
      cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) 
      img = Image.fromarray(cv2image) 
      imgtk = ImageTk.PhotoImage(image=img) 
      lmain.imgtk = imgtk 
      lmain.configure(image=imgtk) 
      if isrunning == 1: 
       lmain.after(10, show_frame) 
      else: 
       cap.release() 
    show_frame() 

def Stop(): 
    global isrunning 
    isrunning = 0 
    lmain.grid_forget() 

def main(): 
    Stop() 
    #Reset.invoke() 
    #stopFunc.invoke() 

root = Tk() 
lmain = Label(root, width = 800, height = 600, bg = "blue") 
stopFunc = Button(root, text = "stop", command = Stop) 
Reset = Button(root, text = "Reset", command = start) 
Main = Button(root, text = "Stop", command = main) 
Start = Button(root, text = "Start", command = start) 
Start.grid(row = 0, column = 0) 
Main.grid(row = 0, column = 1) 

root.mainloop() 

Как вы можете видеть, я добавить одну строку: frame = cv2.resize(frame, (800,600)), чтобы изменить размер изображение.

И я обнаружил, что после добавления этой строки здесь произошла ошибка, когда я нажал кнопку «Стоп». Поэтому я пытаюсь использовать cap.release() для отпускания камеры каждый раз, когда вы нажимаете кнопку «Стоп». Но у меня нет веб-камеры для проверки этого кода сейчас, я не могу гарантировать, что он будет работать, когда вы снова начнете поток. Надеюсь, поможет.

+0

Он получил ярлык, но вы не можете его перезапустить. Я немного подкорректирую его, и я опубликую результат. –

+0

Работает хорошо, если вы раскомментируете две строки кода. –

+0

Хорошо, спасибо. Я думаю, вы можете использовать метод, который вы использовали раньше, чтобы остановить поток, хотя здесь будет ошибка, когда пользователи остановят поток. В любом случае, это не должно повлиять на результат. –