python - 如何切换 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')
解决方案
推荐阅读
- azure - 在 Azure IOT 中心捕获设备孪生更改事件
- powershell - 仅按名称分配 powershell 参数
- docker - Apache Spark docker 官方仓库在哪里
- docker - Docker ubuntu 18.04 ssh-keyscan
- c++ - 如何在 Vectors 中使用 'find' 和 'substr' 函数?
- node.js - 音乐不和谐 js 机器人问题
- vue.js - 为什么 Vue 更新所有组件,而不仅仅是 v-for 中更改的组件?
- c# - 请求和动作之间的 Asp.net 核心中间件路由延迟
- javascript - 将 TypeScript 声明编译/复制到输出目录
- android - 如何在 Android Studio 中构建 CHAQUOPY Android 库(.AAR 或 .JAR 文件)