OpenCV无法获得成功

时间:2018-12-16 20:28:14

标签: python opencv pyinstaller

我正在使用OpenCV库编写Python脚本。该代码可以正常工作,只有一点点。我将使用pyinstaller构建脚本,因此需要引用haarcascade。

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')

这可行,但这是

def resource_path(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)


face_cascade = cv2.CascadeClassifier(resource_path('haarcascade_frontalface_alt.xml'))

没有。需要解决此问题的帮助

这是问题所在:级联无法加载,“ detectMultiScale”将失败。

相同的解决方案适用于我的另一个项目

这是我得到的错误: [The error I'm getting] 我尝试使用“ face_cascade.load()”,它的工作方式如下:

face_cascade.load('haarcascade_frontalface_alt.xml')

但是再次不适用于“ resource_path”功能

这样做

import os.path
print(os.path.isfile(resource_path('haarcascade_frontalface_alt.xml')))

在控制台中打印“ True”

我还尝试删除所有与检测面部有关的代码,发现OpenCV成功捕获了我的网络摄像头

这里是所有代码:如果有人感兴趣

import numpy as np
import cv2, os



cap = cv2.VideoCapture(0)
xe = 0
ye = 0
we = 0
he = 0
def resource_path(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)


import os.path
print(os.path.isfile(resource_path('haarcascade_frontalface_alt.xml')))



face_cascade = cv2.CascadeClassifier(resource_path('haarcascade_frontalface_alt.xml'))
face_cascade.load(resource_path('haarcascade_frontalface_alt.xml'))


while 1:
    ret = cap.set(3,640);
    ret = cap.set(4,480);
    ret, img = cap.read()

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.2, 5)
    dst = img

    for (x,y,w,h) in faces:
        dst = img
        rows,cols,channels = img.shape
        xe = x
        ye = y
        we = w
        he = h

    rows,cols,channels = img.shape
    pts1 = np.float32([[xe-100,ye-100],[xe+2*we+200,ye-100],[xe-100,ye+2*he+200],[xe+2*we+200,ye+2*he+200]])
    pts2 = np.float32([[0,0],[cols,0],[0,rows],[cols,rows]])
    M = cv2.getPerspectiveTransform(pts1,pts2)
    dst = cv2.warpPerspective(img,M,(300,300))
    dst = cv2.resize(dst,(cols, rows), interpolation = cv2.INTER_CUBIC)

    cv2.imshow('img',img)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

编辑:

我发现了错误的原因:进入haarcascade包含西里尔字母,这就是OpenCV加载文件时遇到困难的原因

4 个答案:

答案 0 :(得分:0)

haarcascade文件实际上位于您期望的位置吗?

在您的resource_path函数中,您可以检查文件是否确实存在于为确保确定而创建的完整路径上。

答案 1 :(得分:0)

如果遇到此问题,请消除通往级联路径中的所有西里尔字母

答案 2 :(得分:0)

好的,即使我也面临着同样的问题。问题是您必须在外部提供haarcascade到分类器功能的目录链接。

对我来说,使用anaconda就是在这个目录中:

C:\ Users \ lhari \ anaconda3 \ pkgs \ libopencv-3.4.2-h20b85fd_0 \ Library \ etc \ haarcascades

然后,您可以加入自己的道路,并按照下面的方式将其放在对我有用的位置!

path = os.path.join(r"<Your directory to the opencv package>",  r"haarcascade_frontalface_default.xml")
face_classifier = cv2.CascadeClassifier(path)

答案 3 :(得分:0)

我能理解的是,您在构建exe时需要传递facecascade文件。

请尝试:

pyinstaller <filename> --add-data="<location of cascade>:.>"

通过运行此命令,应用程序将具有级联文件。 更多详细信息,请参见here