Python 在从另一个.py文件调用的函数中使用cv2.detectMultiScale()时出错

Python 在从另一个.py文件调用的函数中使用cv2.detectMultiScale()时出错,python,opencv,Python,Opencv,这是我在这里的第一个问题,所以我希望我以正确的方式提问 我正在使用Windows 10的笔记本电脑上运行Python 3.6.3(Anaconda 64位安装) 我有一个主要的例程,其中包括通过cv2.VideoCapture()捕获视频。另一个文件存储执行人脸检测的功能。从主程序调用函数时,我收到以下错误消息: 错误:(-215)!函数cv::CascadeClassifier::detectMultiScale中的空() 以下是代码的简化版本: 主程序: 我已经搜索了这个错误,据我所知,这是

这是我在这里的第一个问题,所以我希望我以正确的方式提问

我正在使用Windows 10的笔记本电脑上运行Python 3.6.3(Anaconda 64位安装)

我有一个主要的例程,其中包括通过cv2.VideoCapture()捕获视频。另一个文件存储执行人脸检测的功能。从主程序调用函数时,我收到以下错误消息: 错误:(-215)!函数cv::CascadeClassifier::detectMultiScale中的空()

以下是代码的简化版本:

主程序:

我已经搜索了这个错误,据我所知,这是由于没有以numpy.array格式提供给cv2.detectMultiScale()的适当图像造成的。因此,我尝试进一步简化代码以隔离错误:

主要程序:

当我运行这个简化版本的代码时,不会出现错误,但是,尽管每次迭代都会打印出正确的数组,但是使用cv2.imshow()创建的窗口会显示一个灰色图像


我非常感谢你的帮助。提前多谢

您需要修复简化版本

  • 函数的名称是
    函数
    而不是
    文件
  • 您需要调用
    cv2.waitKey(1)
  • 您没有递增
    x
  • 这是固定密码

    from file import function
    
    import cv2
    
    cap = cv2.VideoCapture(0)
    
    x = 0
    while x<300:
        ret, frame = cap.read()
        output = function(ret, frame)
        cv2.imshow("window", output)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        print(output)
        x += 1
    
    cv2.destroyAllWindows()
    cap.release()
    
    从文件导入功能
    进口cv2
    cap=cv2.视频捕获(0)
    x=0
    
    虽然X非常火爆!!!,这解决了简化版本中的问题。我在第一个例程中发现了错误,它与detectMultiScale()无关。问题是cv2.CascadeClassifier()调用的xml文件不在指定的路径中。
    def facecounter(frame, ret):
    
        import cv2
    
        face_classifier = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml
        if ret is True:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            faces = face_classifier.detectMultiScale(gray, 1.3, 5)
            number_faces = len(faces)
    
        return number_faces
    
    from file import function
    
    import cv2
    
    cap = cv2.VideoCapture(0)
    
    x = 0
    while x<300:
        ret, frame = cap.read()
        output = file(ret, frame)
        cv2.imshow("window", output)
        print(output)
    
    cv2.destroyAllWindows()
    cap.release()
    
    import cv2
    
    def function(ret, frame):
        output = frame
    
        return output
    
    from file import function
    
    import cv2
    
    cap = cv2.VideoCapture(0)
    
    x = 0
    while x<300:
        ret, frame = cap.read()
        output = function(ret, frame)
        cv2.imshow("window", output)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        print(output)
        x += 1
    
    cv2.destroyAllWindows()
    cap.release()