首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python 3中从对话框打开图像文件?

如何在Python 3中从对话框打开图像文件?
EN

Stack Overflow用户
提问于 2018-07-19 02:44:43
回答 1查看 1.8K关注 0票数 1

我试图创建一个简单的界面,用户可以从中选择图像作为输入。THen我正在使用numpy和opencv在图像上做事情。我使用了tkinter的askopenfilename()和easygui的fileopenbox。它们似乎不会返回图像。

我得到的错误是:TypeError: src is not a numpy array, neither a scalar

我的代码

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-19 03:35:06

发生错误的原因是您正在传递要作为图像文件读取的Unicode对象。行img = easygui.fileopenbox()img作为Unicode 返回,而不是像预期的那样图像数组。

如何将其转换?

  • 首先将unicode转换为字符串。有一个名为unicodedata的库就是为了这个目的。(我已经在下面的代码中展示了如何使用它)
  • 接下来读取此字符串,并将结果图像文件存储为数组。

以下代码将帮助您解决问题

代码:

代码语言:javascript
复制
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()

更新:

我已经对您提供的代码进行了必要的修改。只需复制以下代码并执行即可:

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51408987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档