我正在尝试创建一个简单的界面,用户可以从中选择要输入的图像。然后,我使用numpy和opencv在图像上执行操作。我已经使用了来自tkinter的askopenfilename()和来自easygui的fileopenbox。 他们似乎没有返回图像。
我得到的错误是:TypeError: src is not a numpy array, neither a scalar
我的代码
import numpy as np
import cv2 as cv
import easygui
face_cascade = cv.CascadeClassifier('face.xml')
def todo():
img = easygui.fileopenbox()
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 7, 7)
for (x,y,w,h) in faces:
cv.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
todo()
答案 0 :(得分:0)
发生此错误是因为您要传递Unicode对象以将其作为图像文件读取。第img = easygui.fileopenbox()
行返回了img
作为Unicode 不是期望的图像数组。
unicodedata
库。 (我已经在下面的代码中展示了如何使用它)以下代码将帮助您
代码:
import numpy as np
import cv2
import easygui
import unicodedata
path = 'C:/Users/Jackson/Desktop/Stack/face_detection/'
face_cascade = cv2.CascadeClassifier(path + 'haarcascade_frontalface_default.xml')
uni_img = easygui.fileopenbox()
img_path = unicodedata.normalize('NFKD', uni_img).encode('ascii','ignore')
img = cv2.imread(img_path, 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我已经对您提供的代码进行了必要的修改。只需复制以下内容并执行:
import numpy as np
import cv2 as cv
import easygui
face_cascade = cv.CascadeClassifier('face.xml')
def todo():
#--- returns the Unicode ---
uni_code = easygui.fileopenbox()
#--- converting unicode to string ---
img_path = unicodedata.normalize('NFKD', uni_code).encode('ascii','ignore')
img = cv2.imread(img_path, 1)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 7, 7)
for (x,y,w,h) in faces:
cv.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
todo()