0

在这里,我使用堡盟机器视觉相机和 tkinter 框架来制作 gui 应用程序。我从相机捕获图像并使用 PIL 库进行转换,但标签会为 numpy 数组引发错误。这个应用程序适用于网络摄像头,所以我无法理解相机图像数据的差异。

import neoapi
from neoapi.neoapi import NeoException
import numpy as np
import cv2 
from tkinter import *
import sys
from PIL import Image, ImageTk


try:
    
    camera = neoapi.Cam()
    camera.Connect()
    dim = (640,480)
    camera.f.ExposureTime = 4000
    camera.f.Width = 640
    camera.f.Height = 480



except(neoapi.NeoException, Exception)as exc:
    print(exc)

root = Tk()


def main():
    while True:
         img =camera.GetImage().GetNPArray()
         img2 = Tk.PhotoImage(Image.fromarray(img))
         L1['Image'] = img2
         
        
         



L1 = Label(root,borderwidth=1,text= ' var')
L1.pack()    




B1 = Button(root,text='connnect',command= main).pack()
root.mainloop()
4

1 回答 1

0

首先,您需要使用ImageTk.PhotoImage而不是 tkinter PhotoImage

第二个更好的用途threading或 tkinter.after()代替 tkinter 应用程序中的 while 循环,因为 while 循环将阻止 tkintermainloop()更新和处理未决事件。

下面是一个使用.after()while 循环代替的示例:

def main():
    img = camera.GetImage()
    if not img.IsEmpty():
        img = img.GetNPArray()
        # use ImageTk.PhotoImage instead
        img2 = ImageTk.PhotoImage(Image.fromarray(img))
        # use L1['image'] instead of L1['Image']
        L1['image'] = img2
        # save a reference of the image
        L1.image = img2
    # call main() after 25ms later (use other value to suit your case)
    L1.after(25, main)

请注意,您应该避免main()多次调用(即多次单击connect),因为它会创建多个周期性任务。

于 2021-06-24T05:59:57.830 回答