簡體   English   中英

Python - tkinter; 類型錯誤:預期的 Ptr<cv::umat> 對於參數“src”</cv::umat>

[英]Python - tkinter; TypeError: Expected Ptr<cv::UMat> for argument 'src'

我正在嘗試為圖像處理構建圖形界面。 我在上傳 function 時遇到問題。 當我嘗試檢查文件/圖像是否存在並對其進行修改時,我收到此錯誤並且我不知道如何修復它。

TypeError: Expected Ptr<cv::UMat> for argument 'src'

這是我的代碼:

import cv2

import instructions as instructions
from PIL import Image,ImageTk
from tkinter.filedialog import askopenfile

root = tk.Tk()

logo = Image.open('logo.png')
logo = ImageTk.PhotoImage(logo)
logo_label = tk.Label(image = logo)
logo_label.image = logo
logo_label.grid(column=1,row=0)

def upload():
    browse.set("loading...")
    file = askopenfile(parent=root,mode="rb",title="Choose an image",filetypes =[("JPG file","*.jpg"),("PNG file","*.png"),("JPEG file","*.jpeg")])
    if file:
        gray = cv2.cvtColor(file, cv2.COLOR_RGB2GRAY)
        gray = cv2.medianBlur(gray,5)
        edges = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 9, 9)

        color = cv2.bilateralFilter(file,9,250,250)
        cartoon =cv2.bitwise_and(color,color,mask=edges)
        cv2.imshow("Cartoon", cartoon)

intructions = tk.Label(root,text= "Select an image",font = "Raleway")
instructions.grid(columnspan=3,column=0,row=1)



browse = tk.StringVar()
browse_button = tk.Button(root,textvariable = browse,command = lambda:upload(),font = "Raleway",bg="#20bebe",fg ="white",width=15,height =2)
browse.set("Browse")
browse_button.grid(column=1,row=2)

canvas = tk.Canvas(root,width = 600,height = 300)
canvas.grid(columnspan = 3)
root.mainloop()

謝謝!

您需要將圖像傳遞給cv2.cvtColor ,您當前正在傳遞一個字符串file

    if file:
        src = cv2.imread(file)
        gray = cv2.cvtColor(src, cv2.COLOR_RGB2GRAY)
        gray = cv2.medianBlur(gray,5)

在第 20 行:您正在使用 CvtColor 將圖像更改為灰度。
gray = cv2.cvtColor(file, cv2.COLOR_RGB2GRAY)您需要傳遞文件指針來代替文件。 這就是為什么您收到錯誤TypeError: Expected Ptr<cv::UMat> for argument 'src'

你需要:
首先使用img=cv2.imread(file)讀取文件,然后使用
使用gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)對 img 數據進行 CvtColor。

所以刪除第20行的內容並添加

 img=cv2.imread(file) gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

編輯:
第 6 行的一件重要事情是導入 askopenfile,它返回圖像的二進制編碼路徑。 這是錯誤的實現。
相反,您應該導入 askopenfilename; 這將返回圖像文件的路徑。
我在這里分享整個更新的代碼:

 import cv2 import tkinter as tk import instructions as instructions from PIL import Image,ImageTk from tkinter.filedialog import askopenfilename root = tk.Tk() logo = Image.open('logo.jpg') logo = ImageTk.PhotoImage(logo) logo_label = tk.Label(image = logo) logo_label.image = logo logo_label.grid(column=1,row=0) def upload(): browse.set("loading...") file = askopenfilename(parent=root,title="Choose an image",filetypes =[("JPG file","*.jpg"),("PNG file","*.png"),("JPEG file","*.jpeg")]) print(file) if file: img=cv2.imread(file) gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) gray = cv2.medianBlur(gray,5) edges = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 9, 9) color = cv2.bilateralFilter(img,9,250,250) cartoon =cv2.bitwise_and(color,color,mask=edges) cv2.imshow("Cartoon", cartoon) intructions = tk.Label(root,text= "Select an image",font = "Raleway") instructions.grid(columnspan=3,column=0,row=1) browse = tk.StringVar() browse_button = tk.Button(root,textvariable = browse,command = lambda:upload(),font = "Raleway",bg="#20bebe",fg ="white",width=15,height =2) browse.set("Browse") browse_button.grid(column=1,row=2) canvas = tk.Canvas(root,width = 600,height = 300) canvas.grid(columnspan = 3) root.mainloop()
這應該工作讓我知道。
希望這可以解決您的目的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM