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

时间:2018-06-28 15:25:26

标签: python opencv

这是我在这里的第一个问题,所以我希望我以适当的方式提问。

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

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

这是代码的简化版本:

主程序:

from facecounter import facecounter
import cv2

 cap = cv2.VideoCapture(0)

x = 0   
while x < 20:
    ret, frame = cap.read()
    print(type(frame))
    output = facecounter(frame, ret)
    cv2.imshow("output", output)
    cv2.waitKey()
    x += 1

cv2.destroyAllWindows()
cap.release()

存储在facecounter.py中的函数:

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

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

主例程:

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()

函数存储在file.py中:

import cv2

def function(ret, frame):
    output = frame

    return output

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

非常感谢您的帮助。在此先多谢!

1 个答案:

答案 0 :(得分:0)

您需要修复简化版本。

  1. 函数的名称为function,而不是file
  2. 您需要致电cv2.waitKey(1)
  3. 您没有递增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()

也不要将您的python文件命名为file.py,将其命名为image_processing.py或与Python使用的名称不冲突的方法。