Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从网络摄像头捕获图像将它们显示在同一窗口中,并存储在用户使用python tkinter和opencv指定的目录中_Python_Opencv_Tkinter - Fatal编程技术网

从网络摄像头捕获图像将它们显示在同一窗口中,并存储在用户使用python tkinter和opencv指定的目录中

从网络摄像头捕获图像将它们显示在同一窗口中,并存储在用户使用python tkinter和opencv指定的目录中,python,opencv,tkinter,Python,Opencv,Tkinter,我正在尝试使用tkinter创建一个gui,其中在子目录“raw”下的C:drive中创建一个文件夹,并在条目小部件中使用用户指定的条目。创建文件夹时,我希望单击使用opencv的实时网络摄像头序列中的图像。问题:仅捕获一张图像!我想捕获同一个人的30张图像,并存储在C:/raw/s中,其中s是用户指定的目录。下面是代码。我不知道为什么img_计数器变量没有得到更新。如果您有任何输入,我们将不胜感激 import tkinter as tk import cv2 from tkinter im

我正在尝试使用tkinter创建一个gui,其中在子目录“raw”下的C:drive中创建一个文件夹,并在条目小部件中使用用户指定的条目。创建文件夹时,我希望单击使用opencv的实时网络摄像头序列中的图像。问题:仅捕获一张图像!我想捕获同一个人的30张图像,并存储在C:/raw/s中,其中s是用户指定的目录。下面是代码。我不知道为什么img_计数器变量没有得到更新。如果您有任何输入,我们将不胜感激

import tkinter as tk

import cv2
from tkinter import *
from PIL import Image, ImageTk
import os
import tkMessageBox
from multiprocessing import Process, Queue

width, height = 800, 600
cap = cv2.VideoCapture(0)
flag,frame=cap.read()

#cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
#cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
global img_counter

root = tk.Tk()
root.bind('<Escape>', lambda e: root.quit())
lmain = tk.Label(root)
lmain.pack()
tk.Label(text='Enter your name')

entry = tk.Entry(root, width=10)
entry.pack(side=tk.TOP,padx=10,pady=10)

#e = Entry(root,width=10)
#e.pack(side=TOP,padx=10,pady=10)

entry.delete(0, tk.END)
entry.insert(0, "username")

def onok():
    s = entry.get()
    mypath='C:\\raw\\'
    mypath=os.path.join(os.path.dirname(mypath), s)
    os.mkdir(mypath, 0777)
    tkMessageBox.showinfo(title=s,message="Your name is now entered.Start  taking images")
    entry.destroy()
#tk.Button(root,text='click',command=onclick).pack()
    img_counter = 0
    click_button = tk.Button(master=root, text='Click', command=lambda: saveImage(img_counter))
    click_button.pack()

def saveImage(img_counter):


    ret, frame = cap.read()
    cv2.imshow("test", frame)


    img_name = "opencv_frame_{}.png".format(img_counter)



    cv2.imwrite(img_name, frame)
    print("{} written!".format(img_name))
    img_counter += 1

tk.Button(root, text='OK', command=onok).pack(side=tk.LEFT)
#tk.Button(root, text='CLOSE').pack(side= tk.RIGHT)

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)
    lmain.after(10, show_frame)

show_frame()
root.mainloop()
将tkinter作为tk导入
进口cv2
从tkinter进口*
从PIL导入图像,ImageTk
导入操作系统
导入tkMessageBox
从多处理导入进程,队列
宽度,高度=800600
cap=cv2.视频捕获(0)
flag,frame=cap.read()
#封盖套件(cv2.cap\u PROP\u FRAME\u WIDTH,WIDTH)
#盖组件(cv2.cap\u PROP\u FRAME\u HEIGHT,HEIGHT)
全局img_计数器
root=tk.tk()
root.bind(“”,lambda e:root.quit())
lmain=tk.标签(根)
l主要包装
标签(text='Enter your name')
entry=tk.entry(根,宽度=10)
入口包装(侧面=tk.顶部,padx=10,pady=10)
#e=入口(根,宽度=10)
#e、 组件(侧面=顶部,padx=10,pady=10)
entry.delete(0,tk.END)
条目。插入(0,“用户名”)
def onok():
s=entry.get()
mypath='C:\\raw\\'
mypath=os.path.join(os.path.dirname(mypath),s)
os.mkdir(mypath,0777)
tkMessageBox.showinfo(title=s,message=“现在输入您的姓名。开始拍照”)
entry.destroy()
#按钮(root,text='click',command=onclick).pack()
img_计数器=0
单击按钮=tk.button(master=root,text='click',command=lambda:saveImage(img\u计数器))
单击“”按钮。打包()
def saveImage(img_计数器):
ret,frame=cap.read()
cv2.imshow(“测试”,帧)
img_name=“opencv_frame{}.png”。格式(img_计数器)
cv2.imwrite(img_名称,帧)
打印(“{}写入!”.格式(img_名称))
img_计数器+=1
按钮(root,text='OK',command=onok).pack(side=tk.LEFT)
#按钮(root,text='CLOSE').pack(side=tk.RIGHT)
def show_frame():
_,frame=cap.read()
帧=cv2。翻转(帧,1)
cv2image=cv2.CVT颜色(帧,cv2.COLOR_BGR2RGBA)
img=Image.fromarray(cv2image)
imgtk=ImageTk.PhotoImage(image=img)
lmain.imgtk=imgtk
lmain.configure(image=imgtk)
主后(10,显示帧)
显示帧()
root.mainloop()
我不知道为什么img_计数器变量没有得到更新

首先,您需要了解Python中的可变和不可变对象,到目前为止,整数都是可变的

然后,声明全局
img_计数器
,并尝试调用该函数。 所以您可以访问该值,但无法修改它,因为您错误地使用了
global
关键字。使用
global
关键字,您可以选择所需的功能!请看下面的代码:

# declare global
counter = int()

# let's try to counter
def try_to_counter():
    global counter
    counter += 1

# simple loop
def main_loop():
    for _ in range(5):
        try_to_counter()
        print(counter)

main_loop()
使用
global
关键字,您可以在函数中声明全局变量(不要这样做!)

正如您所看到的,在这两种情况下,都不需要将某些内容传递给函数!所以在你的代码中你可以去掉lambda函数

...
img_counter = int()
...
click_button = tk.Button(master=root, text='Click', command=saveImage)
...
def saveImage():
    global img_counter
    ...
    img_counter += 1
...
后记:

谢谢!!。我是python和opencv的新手。我修复了其余的代码。现在它实现了我最初的意图。谢谢again@CommonSenseglad来帮忙!看看你的进口货!您导入了
tkinter
两次!您可以从tkinter import*行中删除
。当您使用星号导入时,您将导入当前名称空间中的所有内容,因此您可以声明/使用不带
tk.
前缀的常量。因为您使用了
tk.
前缀,所以根本没有理由进行第二次导入!
...
img_counter = int()
...
click_button = tk.Button(master=root, text='Click', command=saveImage)
...
def saveImage():
    global img_counter
    ...
    img_counter += 1
...