cv2.imread 循环图像时出错

问题描述 投票:0回答:1

当我循环访问文件夹中存储的图像时遇到错误。总的来说,我想要完成的是使用相应的 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() 是一个错误。

python opencv machine-learning haar-classifier
1个回答
0
投票

这不是

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
© www.soinside.com 2019 - 2024. All rights reserved.