问题描述
我在一个文件夹中有一堆图片,比如 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()