Python2.7CV2&;带网络摄像头的Tkinter
我正在使用Tkinter制作一个gui来显示usb摄像头的输出。这是一个显微镜实验,其思想是gui显示一个低分辨率的实时流,但点击一个按钮,就会拍摄一幅高分辨率的图像。我已经能够让代码与我笔记本电脑的内置网络摄像头一起工作(VideoCapture(0)),但当我尝试将代码与预期的网络摄像头(-VideoCapture(1))一起使用时,它崩溃了。 代码如下:Python2.7CV2&;带网络摄像头的Tkinter,python,python-2.7,opencv,tkinter,Python,Python 2.7,Opencv,Tkinter,我正在使用Tkinter制作一个gui来显示usb摄像头的输出。这是一个显微镜实验,其思想是gui显示一个低分辨率的实时流,但点击一个按钮,就会拍摄一幅高分辨率的图像。我已经能够让代码与我笔记本电脑的内置网络摄像头一起工作(VideoCapture(0)),但当我尝试将代码与预期的网络摄像头(-VideoCapture(1))一起使用时,它崩溃了。 代码如下: import Tkinter as tk import cv2 import cv2.cv as cv import numpy as
import Tkinter as tk
import cv2
import cv2.cv as cv
import numpy as np
from PIL import Image, ImageTk
global counter
counter = 0
global save_dir
save_dir = "C:/Users/etc..."
global runner
runner = 50
global run_num
run_num = "50"
##########################################################################
global hi_w, hi_h
global lo_w, lo_h
hi_w, hi_h = 640,480 # Camera intended resolution 2592,1944
lo_w, lo_h = 320,240 # Camera intended resolution 640,480
cap = cv2.VideoCapture(1)
cap.set(3, lo_w)
cap.set(4, lo_h)
cap.set(5,15)
##########################################################################
# Define the Tkinter functions
#-- QUIT_ --#
#-----------#
def quit_(root):
root.destroy()
#---------------------
#-- FUNCTION1 --#
#---------------#
def function1(root):
global counter
counter = 1
#---------------------
#-- FUNCTION2 --#
#---------------#
def function2(root):
global counter
counter = 2
#---------------------
#-- FUNCTION3 --#
#---------------#
def function3(root):
global counter
counter = 3
#---------------------
def capture(filename):
print 'capturing'
global hi_w, hi_h, lo_w, lo_h
cap.set(3, hi_w)
cap.set(4, hi_h)
flag2, frame2 = cap.read()
frame2 = cv2.flip(frame2, 1)
print 'writing'
cv2.imwrite(filename, frame2)
print 'resetting'
cap.set(3, lo_w)
cap.set(4, lo_h)
del flag2, frame2
global counter
counter = 0
def show_frame():
#Set up dummy frame
global counter, save_dir, runner, run_num
if counter == 1:
flag,frame = cap.read()
filename = save_dir + "z01_" + run_num + ".jpeg"
capture(filename)
elif counter == 2:
flag, frame = cap.read()
filename = save_dir + "z02_" + run_num + ".jpeg"
capture(filename)
elif counter == 3:
flag, frame = cap.read()
filename = save_dir + "z03_" + run_num + ".jpeg"
capture(filename)
runner = runner + 1
run_num = '{0:02d}'.format(runner)
counter = 0
else:
flag, 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)
lmain.after(10, show_frame)
if __name__ == '__main__':
root = tk.Tk()
lmain = tk.Label(master=root)
lmain.grid(column=0, rowspan=4, padx=5, pady=5)
button1 = tk.Button(master=root, text='Function 1', command=lambda: function1(root))
button1.grid(column=1, columnspan=2, row=0, padx=5, pady=5)
button2 = tk.Button(master=root, text='Function 2', command=lambda: function2(root))
button2.grid(column=1, columnspan=2, row=1, padx=5, pady=5)
button3 = tk.Button(master=root, text='Function 3', command=lambda: function3(root))
button3.grid(column=1, columnspan=2, row=2, padx=5, pady=5)
quit_button = tk.Button(master=root, text='Quit',bg="red3", fg="white", command=lambda: quit_(root))
quit_button.grid(column=1, row=3, padx=5, pady=5)
show_frame()
root.mainloop()
cap.release()
第一次按下按钮后程序崩溃,出现以下错误
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1486, in __call__
return self.func(*args)
File "C:\Python27\lib\lib-tk\Tkinter.py", line 533, in callit
func(*args)
File "C:/Users/.../LI_USB_GUI_RR_worksWithInBuiltCam2.py", line 109, in show_frame
cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
error: ..\..\..\..\opencv\modules\imgproc\src\color.cpp:3648: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor
要写入的文件大小为零字节。虽然相机仍然打开,并且可以通过外壳进行控制,但本应用于馈送显示器的框架已变空。我真的很困惑,为什么内置摄像头可以工作,而USB不能使用相同的代码
请帮忙……好的,我想我已经解决了这个问题。 基本上,在改变分辨率后准备好下一帧之前,程序会不断尝试要求相机显示下一帧。因此,它返回一个
None
,程序崩溃。我已经解决了这个问题,制作了一个与预览图像大小相同的虚拟帧,并用相机最后一个有效帧填充它。当程序记录高分辨率静态图像时,将显示最后一帧。另外,为了给程序足够的时间来记录图像,我设置了一个while
循环,给相机一段时间来进行自我配置并记录图像。如果有一个错误,它超时了,我可以创建一个方法来安全地关闭程序。下面是新代码,除了处理异常之外——可以安全关闭应用程序的样板文件可以放在那里
import Tkinter as tk
import cv2
import cv2.cv as cv
import numpy as np
from PIL import Image, ImageTk
import time
global save_dir
save_dir = "C:/Users/.../"
global runner
runner = 00
global run_num
run_num = "00"
##########################################################################
##########################################################################
global hi_w, hi_h
global lo_w, lo_h
hi_w, hi_h = 2592,1944
lo_w, lo_h = 640,480
#Set up dummy frame
global last_frame
last_frame = np.zeros((lo_h, lo_w, 3), dtype=np.uint8)
global cap
cap = cv2.VideoCapture(1)
cap.set(3, lo_w)
cap.set(4, lo_h)
##########################################################################
##########################################################################
# Define the Tkinter functions
#-- QUIT_ --#
#-----------#
def quit_(root):
root.destroy()
#---------------------
#-- FUNCTION1 --#
#---------------#
def function1(root):
global save_dir, run_num
filename = save_dir + "z01_" + run_num + ".jpeg"
capture(filename)
#---------------------
#-- FUNCTION2 --#
#---------------#
def function2(root):
global save_dir, run_num
filename = save_dir + "z02_" + run_num + ".jpeg"
capture(filename)
#---------------------
#-- FUNCTION3 --#
#---------------#
def function3(root):
global save_dir, runner, run_num
filename = save_dir + "z03_" + run_num + ".jpeg"
capture(filename)
runner = runner + 1
run_num = '{0:02d}'.format(runner)
#---------------------
def capture(filename):
print 'capturing'
cap.set(3, hi_w)
cap.set(4, hi_h)
print time.time()
timeout = time.time() + 30
while time.time() < timeout:
flag2, frame2 = cap.read()
if flag2:
frame2 = cv2.flip(frame2,1)
cv2.imwrite(filename, frame2)
cap.set(3, lo_w)
cap.set(4, lo_h)
time.sleep(1)
global counter
counter = 0
break
else:
time.sleep(1)
else:
<code to handle timeout appropriately>
#---------------------
def show_frame():
global counter, save_dir, runner, run_num
flag, frame = cap.read()
frame = cv2.flip(frame, 1)
if flag is None:
print "Major error!"
<code to handle exception>
elif flag:
global last_frame
last_frame = frame.copy()
else:
print "Cant process the image"
<code to handle exception>
cv2image = cv2.cvtColor(last_frame, cv2.COLOR_BGR2RGBA)
img = Image.fromarray(cv2image)
imgtk = ImageTk.PhotoImage(image=img)
lmain.imgtk = imgtk
lmain.configure(image=imgtk)
lmain.after(10, show_frame)
##########################################################################
##########################################################################
if __name__ == '__main__':
root = tk.Tk()
lmain = tk.Label(master=root)
lmain.grid(column=0, rowspan=4, padx=5, pady=5)
button1 = tk.Button(master=root, text='Function 1', command=lambda: function1(root))
button1.grid(column=1, columnspan=2, row=0, padx=5, pady=5)
button2 = tk.Button(master=root, text='Function 2', command=lambda: function2(root))
button2.grid(column=1, columnspan=2, row=1, padx=5, pady=5)
button3 = tk.Button(master=root, text='Function 3', command=lambda: function3(root))
button3.grid(column=1, columnspan=2, row=2, padx=5, pady=5)
quit_button = tk.Button(master=root, text='Quit',bg="red3", fg="white", command=lambda: quit_(root))
quit_button.grid(column=1, row=3, padx=5, pady=5)
show_frame()
root.mainloop()
cap.release()
将Tkinter作为tk导入
进口cv2
将cv2.cv作为cv导入
将numpy作为np导入
从PIL导入图像,ImageTk
导入时间
全局保存目录
save_dir=“C:/Users/…”
全球跑步者
跑步者=00
全局运行数
运行\u num=“00”
##########################################################################
##########################################################################
全球hi_w,hi_h
全球低成本,低成本
hi_w,hi_h=25921944
低w,低h=640480
#设置虚拟框架
全局最后一帧
最后一帧=np.zeros((低高,低低低低,3),数据类型=np.uint8)
全球上限
cap=cv2.视频捕获(1)
帽套(3,低西)
封盖组件(4个,底部)
##########################################################################
##########################################################################
#定义Tkinter函数
#--退出--#
#-----------#
def退出(根):
root.destroy()
#---------------------
#--功能1--#
#---------------#
def功能1(根):
全局保存目录,运行编号
filename=save_dir+“z01_u”+run_num+“.jpeg”
捕获(文件名)
#---------------------
#--功能2--#
#---------------#
def function2(根目录):
全局保存目录,运行编号
filename=save_dir+“z02_”+run_num+“.jpeg”
捕获(文件名)
#---------------------
#--功能3--#
#---------------#
def功能3(根目录):
全局保存目录、运行器、运行数
filename=save_dir+“z03_u”+run_num+“.jpeg”
捕获(文件名)
转轮=转轮+1
run_num='{0:02d}'。格式(runner)
#---------------------
def捕获(文件名):
打印“捕获”
帽套(3,高w)
帽套(4,高)
打印时间
超时=时间。时间()+30
while time.time()<超时:
flag2,frame2=cap.read()
如果标记2:
frame2=cv2.flip(frame2,1)
imwrite(文件名,frame2)
帽套(3,低西)
封盖组件(4个,底部)
时间。睡眠(1)
全局计数器
计数器=0
打破
其他:
时间。睡眠(1)
其他:
<适当处理超时的代码>
#---------------------
def show_frame():
全局计数器,保存目录,运行程序,运行编号
flag,frame=cap.read()
帧=cv2。翻转(帧,1)
如果标志为无:
打印“重大错误!”
<处理异常的代码>
elif标志:
全局最后一帧
最后一帧=帧。复制()
其他:
打印“无法处理图像”
<处理异常的代码>
cv2image=cv2.CVT颜色(最后一帧,cv2.COLOR\U BGR2RGBA)
img=Image.fromarray(cv2image)
imgtk=ImageTk.PhotoImage(image=img)
lmain.imgtk=imgtk
lmain.configure(image=imgtk)
主后(10,显示帧)
##########################################################################
##########################################################################
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=tk.tk()
lmain=tk.Label(master=root)
主网格(列=0,行跨度=4,padx=5,pady=5)
button1=tk.Button(master=root,text=Function 1',command=lambda:function1(root))
按钮1.网格(列=1,列span=2,行=0,padx=5,pady=5)
button2=tk.Button(master=root,text=Function 2',command=lambda:function2(root))
按钮2.网格(列=1,列span=2,行=1,padx=5,pady=5)
button3=tk.Button(master=root,text=Function 3',command=lambda:function3(root))
按钮3.网格(列=1,列span=2,行=2,padx=5,pady=5)
quit_button=tk.button(master=root,text='quit',bg=“red3”,fg=“white”,command=lambda:quit_(root))
退出按钮网格(列=1,行=3,padx=5,pady=5)
显示帧()
root.mainloop()
第1章释放()
感谢所有帮助过你的人。你行中的对象
frame
cv2image=cv2.cvtColor(frame,cv2.COLOR\u BGR2RGBA)
是None
。您可能需要检查cap.read()
返回的值。或者如果frame=cv2.flip(frame,1)
返回一个None
对象。您好,我不幸离开办公桌几天,因此无法进行任何确定的检查,但由于内存不足,您是对的cap.read()
在我尝试调整提要大小时不会返回None,但提要仍然是一个