关于此函数抛出错误有很多问题,例如here和here,但我认为我有一个独特的转折。我想要做的就是浏览文件夹中的所有图像并检测任何面孔。
import cv2
import sys
import os
#Get the folder to be searched and the location of the cascade file from arguments
imageDirectory = sys.argv[1]
cascadePath = sys.argv[2]
faceCascade = cv2.CascadeClassifier(cascadePath)
#Iterate over the png files in the directory
for imagePath in os.listdir(imageDirectory):
if imagePath.endswith(".png"):
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30)
#flags = cv2.CV_HAAR_SCALE_IMAGE
)
第一张图片将被正确处理,但第二张图片会抛出错误:
OpenCV错误:cvtColor中的断言失败(scn == 3 || scn == 4),文件/tmp/opencv3-20170202-24427-1s95vpr/modules/imgproc/src/color.cpp,第9748行 Traceback(最近一次调用最后一次): 文件" face_detect_flip.py",第22行,in gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) cv2.error:/tmp/opencv3-20170202-24427-1s95vpr/modules/imgproc/src/color.cpp:9748:错误:(-215)scn == 3 || scn == 4 in function cvtColor
这些文件都是彩色.pngs所以我无法说明为什么脚本会对其中一些文件有效,而对其他文件无效。有时更改顺序或文件名(但不是扩展名)将改变脚本是否运行,但不会改变我能辨别的任何模式。
答案 0 :(得分:0)
看起来导致此错误的图像没有3(rgb图像)或4(rgba图像)通道。 cvtColor 函数需要图像至少有3个通道才能转换它。
一个可能的原因可能是文件未正确读取。这会导致变量图像为None,因此它没有正确的通道数。
另一个原因可能是图像的通道较少。也许这是一个灰度图像,因此只有一个通道。
您可以使用 print(image.shape)来检查频道数。如果值为None,则表示文件未正确读取。