在 python open cv

问题描述

我在一个文件夹中有一堆图片,比如 200,我想裁剪所有图片。我知道循环浏览文件夹中的图像并执行裁剪的逻辑。我编写了一个代码来裁剪单个图像,但对于多个图像,当我尝试遍历它们时,它显示错误

这是针对单个图像的。这工作正常

import numpy as np
import cv2
import os

count=0
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
img = cv2.imread('C:\\Users\\Sasidhar Mankala\\Desktop\\pythonproject\\DataBase creation\\Images\\85.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in faces:
    roi_gray = gray[y:y+h,x:x+w]
    roi_color = img[y:y+h+8,x:x+w+8]
    crop = img[y-8: y+h+8,x-8: x+w+8]
    image_name = str(count)+'.png'
    image_path = os.path.join('C:\\Users\\Sasidhar Mankala\\Desktop\\pythonproject\\DataBase creation\\Cropped_Images',image_name)
    count += 1

cv2.imwrite(image_path,crop)
cv2.waitKey(0)
cv2.destroyAllWindows()

对于多张图片,我做到了这一点,但这个越来越大的错误

import numpy as np
import cv2
import os

count=0
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

directory = 'C:\\Users\\Sasidhar Mankala\\Desktop\\pythonproject\\DataBase creation\\Images'

for images in directory:
    gray = cv2.cvtColor(images,cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray,5)
    for (x,h) in faces:
        # img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0),2)
        roi_gray = gray[y:y+h,x:x+w]
        roi_color = images[y:y+h+8,x:x+w+8]
        crop = images[y-8: y+h+8,x-8: x+w+8]
        image_name = str(count)+'.png'
        image_path = os.path.join('C:\\Users\\Sasidhar Mankala\\Desktop\\pythonproject\\DataBase creation\\Cropped_Images',crop)
cv2.waitKey(0)
cv2.destroyAllWindows()

显示错误

回溯(最近一次调用最后一次): 文件“c:\Users\Sasidhar Mankala\Desktop\pythonproject\DataBase creation\crop.py”,第 11 行,在 灰色 = cv2.cvtColor(图像,cv2.COLOR_BGR2GRAY) 类型错误:参数“src”的预期 Ptr<:umat>

我认为发生这种情况是因为 cvtColor 期待一条特定的路径,但我不知道该怎么做。

请帮我解决这个问题。提前致谢

解决方法

您必须对目录中的图像进行迭代(如果您有其他格式,请随意替换 jpg

import glob
for images in glob.glob(''.join([directory,r"\*.jpg"])):
    # Your code...

在您之前的代码中,您正在迭代一个字符串

,

问题是这一行 for images in directory: 您没有获得每个图像的路径。

要获取每个图像的路径,请执行以下操作:

import os

path_to_images = 'C:/Users/Sasidhar Mankala/Desktop/pythonproject/DataBase reation/Images/'

for imgName in os.listdir(path_to_images):
   imgPath = path_to_images + imgName

os.listdir(directory) 返回该目录中所有文件名的列表

另一个错误是在 cvtColor 的输入中。它需要图像输入而不是图像路径。所以:

image = cv2.imread(imgPath) 
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

您还试图操纵路径。请注意 roi_color 现在如何使用导入的图像,并且在您的代码中它试图使用应该是图像路径(图像)的内容。

   faces = face_cascade.detectMultiScale(gray,1.3,5)
     for (x,y,w,h) in faces:
        # img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0),2)
        roi_gray = gray[y:y+h,x:x+w]
        roi_color = image[y:y+h+8,x:x+w+8]
        crop = image[y-8: y+h+8,x-8: x+w+8]
        image_name = str(count)+'.png'
        image_path = os.path.join('C:\\Users\\Sasidhar Mankala\\Desktop\\pythonproject\\DataBase creation\\Cropped_Images',image_name)
    count += 1

cv2.imwrite(image_path,crop)
cv2.waitKey(0)
cv2.destroyAllWindows()