当我循环访问文件夹中存储的图像时遇到错误。总的来说,我想要完成的是使用相应的 haar 分类器从一系列图像中提取嘴巴特征,即裁剪图像并仅存储其嘴巴。 问题是,在第一次迭代之后,我不断收到 !img_empty() 错误,尽管还有 40 个图像需要处理(目前)。以下是功能代码:
def lip_extraction():
path = "./data/test_cut-opencv/"
os.chdir(path)
images = [cv2.imread(file) for file in glob.glob("*.png")]
print(images)
i=0
for image in images:
# print(len(images))
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
print(len(gray))
faces = face_casecade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
gray = gray[y:y+h, x:x+w]
print(i)
cv2.imwrite("img_1.png", gray)
i+=1
i 是一个用于检查循环的变量。
抛出以下错误:
error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'
有什么建议或解决方案吗?我已经正确地进行了导入,所以不是这样。当我在更改/切片“灰色”后在第二个 for 循环中引入“break”语句时,该代码仅有效一次。否则,它根本不保存任何输出。
我尝试使用不同的路径和不同的方式来访问这些路径,直到无济于事。运行上面的代码表明图像数组已正确初始化,即它读取了所有图像。但在那之后,它说 !img_empty() 是一个错误。
这不是
imread
中的错误,而是imwrite
中的错误(根据您自己的错误消息)。
错误非常明显:你不能
imwrite
和空数组。
既然你写的是gray
,结论就很明显了:gray是一个空数组。
这并不奇怪。因为,我不知道你到底在做什么,但我推测
faces
是图像中找到的不同面孔的边界框数组。
因此,如果你有一张 300x300 的图像,其中有 2 个面孔,一个位于位置 (10,10),大小为 (50×50),另一个位于位置 (100,20),大小为 (50×80)(一张长脸) ),那么你的代码就可以了
# gray is a 300×300 image
gray=gray[10:60,10:60]
# Now gray is is 50×50 image
gray=gray[100:150,20:100]
# Now gray is an empty array since there are no lines 100:150 in a 50×50 image