首页 > 解决方案 > 如何切换 Python Tkinter GUI 摄像头源?

问题描述

首先,我想在此处找到的一段代码上放置一个相机开关选项。首先,我找到了可能的相机索引,并尝试通过按一下按钮来更改相机来源。即使该功能有效,相机源也没有改变。我正在为此寻找解决方案。

换句话说,如何通过该功能更改相机索引。我在开始本主题的“主要”部分之前编写的“returnCameraIndexes ()”函数创建了总相机索引。“ChangeCam(”函数是我获取的所有资源之间进行交换的函数。

import numpy as np
from multiprocessing import Process, Queue
from Queue import Empty
import cv2
from PIL import Image, ImageTk
import time
import Tkinter as tk

#tkinter GUI functions----------------------------------------------------------
def quit_(root, process):
   process.terminate()
   root.destroy()

def update_image(image_label, queue):
   frame = queue.get()
   im = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
   a = Image.fromarray(im)
   b = ImageTk.PhotoImage(image=a)
   image_label.configure(image=b)
   image_label._image_cache = b  # avoid garbage collection
   root.update()

def update_all(root, image_label, queue):
   update_image(image_label, queue)
   root.after(0, func=lambda: update_all(root, image_label, queue))

#multiprocessing image processing functions-------------------------------------
def image_capture(queue,change_camera_flag):
   vidFile = cv2.VideoCapture(change_camera_flag)
   while True:
      try:
         flag, frame=vidFile.read()
         if flag==0:
            break
         queue.put(frame)
         cv2.waitKey(20)
      except:
         continue


#check all camera Sources
def returnCameraIndexes():
    # checks the first 10 indexes.
    index = 0
    arr = []
    i = 10
    while i > 0:
        cap = cv2.VideoCapture(index)
        if cap.read()[0]:
            arr.append(index)
            cap.release()
        index += 1
        i -= 1
    return arr
    
camera_list = returnCameraIndexes()
change_camera_flag = 0

# Switch camera sourcess
def ChangeCam():
    global change_camera_flag,cap_1
    if(len(camera_list)-1 == change_camera_flag):
        change_camera_flag = 0
    else:
        change_camera_flag = change_camera_flag + 1
    print(change_camera_flag)


if __name__ == '__main__':
   queue = Queue()
   print ('queue initialized...')
   root = tk.Tk()
   print ('GUI initialized...')
   image_label = tk.Label(master=root)# label for the video frame
   image_label.pack()
   print ('GUI image label initialized...')
   p = Process(target=image_capture, args=(queue,change_camera_flag))
   p.start()
   print ('image capture process has started...')
   change_source_button = tk.Button(master=root, text='ChangeCamera',command=lambda: ChangeCam())
   change_source_button.pack()
   # quit button
   quit_button = tk.Button(master=root, text='Quit',command=lambda: quit_(root,p))
   quit_button.pack()
   print ('quit button initialized...')
   # setup the update callback
   root.after(0, func=lambda: update_all(root, image_label, queue))
   print ('root.after was called...')
   root.mainloop()
   print ('mainloop exit')
   p.join()
   print ('image capture process exit')

标签: pythonpython-3.xpython-2.7opencvtkinter

解决方案


推荐阅读