函数cv2.imread读取的数据格式是什么?使用tkinter和python

时间:2019-01-07 04:24:34

标签: python python-3.x user-interface tkinter

美好的一天,我刚接触Python编程,因此受命使用GUI内的图像制作自己的GUI。我一直在取得一些不错的进步,但是当我想将图像从网络摄像头插入GUI时,我陷入了困境。但是,我确实设法从网络摄像头获取了图像,但它必须是与GUI窗口不同的窗口。

在我的GUI代码中,它包含一个简单的代码,如下所示:

(我使用范围i <25,因为我的摄像头需要预热)

对于范围在(25)以内的i:

     _ , frame = cap.read()
     frame = cv2.flip(frame, 1)
     cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)

     i+=1

     cv2.imshow("Latex Truck", cv2image)
     img = cv2image
     label = Label(root, image = img)
     label.place(x = 300, y = 300)

现在,问题是这样。我成功地获得了所需的框架,并通过cv2.imshow得以显示,但是当我尝试使用相同的来源(即tkinter中的“ cv2image”)时,它会显示此错误。

Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1487, in __call__
    return self.func(*args)
  File "C:\Users\FF7_C\OneDrive\Desktop\Logo.py", line 82, in Capture
    label = Label(root, image = img)
  File "C:\Python34\lib\tkinter\__init__.py", line 2573, in __init__
    Widget.__init__(self, master, 'label', cnf, kw)
  File "C:\Python34\lib\tkinter\__init__.py", line 2091, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: image "[[[ 49  32  22 255]

现在,从逻辑上讲,我认为我已经做了我需要做的事情,即从我做的网络摄像头中提取图像,现在唯一的问题是我需要了解为什么tkinter无法读取cv2.imshow读取的相同信息。

有人可以指导我吗?非常感谢你! :)

1 个答案:

答案 0 :(得分:0)

cv2.cvtColor(...)返回的格式为numpy.ndarray类型。您需要使用Pillow模块将其转换为tkinter可以识别的格式:

from tkinter import *
from PIL import Image, ImageTk
import cv2

root = Tk()

cap = cv2.VideoCapture(0)
ret, frame = cap.read()

img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
# convert to image format recognized by tkinter
img = Image.fromarray(img)
tkimg = ImageTk.PhotoImage(image=img)

Label(root, image=tkimg).pack()

root.mainloop()