Python 调整图像大小时,模糊会导致人脸和眼睛检测
我正在使用Python在OpenCV中尝试人脸和眼睛检测代码。该代码适用于图像大小为2848 X 4272的情况,甚至当我将其大小调整为0.5倍时也能正常工作。但是,每当我用其他因素(如0.2、0.4等)调整它的大小时,它会给我的眼睛(如额头、鼻子的几个区域)带来模糊的结果。在这种情况下,我无法得到所有图像大小的通用代码。是否有任何代码,使我得到正确的检测与任何图像大小,因为它是非常困难的处理这样大的图像。守则是这样的Python 调整图像大小时,模糊会导致人脸和眼睛检测,python,opencv,face-detection,Python,Opencv,Face Detection,我正在使用Python在OpenCV中尝试人脸和眼睛检测代码。该代码适用于图像大小为2848 X 4272的情况,甚至当我将其大小调整为0.5倍时也能正常工作。但是,每当我用其他因素(如0.2、0.4等)调整它的大小时,它会给我的眼睛(如额头、鼻子的几个区域)带来模糊的结果。在这种情况下,我无法得到所有图像大小的通用代码。是否有任何代码,使我得到正确的检测与任何图像大小,因为它是非常困难的处理这样大的图像。守则是这样的 import numpy as np import cv2 import c
import numpy as np
import cv2
import cv2.cv as cv
#attaching the haar cascade files
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
# reading the image
img11 = cv2.imread('IMG_0347.JPG')
if img11 !=None:
# resizing the image
w,h,c= img11.shape
print "dimension"
print w,h
img = cv2.resize(img11,None,fx=0.4, fy=0.3, interpolation = cv2.INTER_LINEAR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # converting into grayscale
gray = cv2.equalizeHist(gray)
#cv2.imshow('histo',gray)
w,h,c= img.shape # finding out the dimensions of the image i.e width, height and number of channels
# creating a white background of same dimensions as input image for pasting the eyes detected by 'haarcascade_eye.xml'
im = np.zeros((w,h,c),np.uint8)
im[:]=[255,255,255]
# creating a white background of same dimensions as input image for pasting the masked eyes
im_mask = np.zeros((w,h,c),np.uint8)
im_mask[:]=[255,255,255]
# faces gives the top left coordinates of the detected face and width and height of the rectangle
faces = face_cascade.detectMultiScale(gray, 1.5, 5)
# taking face as the ROI
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),1) # Draws the rectangle around the detected face
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
#cv2.imshow('image1',img) # shows the original image with face detected
#cv2.imshow('image1',roi_color) # shows only the face detected (colored)
# searching for eyes in the detected face i.e in the roi gray
eyes = eye_cascade.detectMultiScale(roi_gray)
#print eyes # prints the top left coordinates of the detected eyes and width and height of the rectangle
if eyes.any():
for (ex,ey,ew,eh)in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),1) # draws rectangle around the masked eyes
eye_mask= roi_color[ey+1:u, ex+1:ex+ew] # eye_mask is the masked portion of the detected eye extracted from roi_color
im_mask[ey+1+y:y+u, ex+x+1:ex+ew+x]=eye_mask #pasting the eye_mask on the white background called im_mask
else:
print ("eyes could not be detected")
cv2.imshow('image',im_mask) #shows the im-mask white background with masked eyes pasted on it
例如,随着图像变得越来越小,区分眼睛和鼻子就变得越来越困难,这是合乎逻辑的。因此,除非您从根本上了解图像分析功能需要什么(我不知道),否则很难知道缩小图像尺寸的最佳方法,同时保留分析所需的信息类型 话虽如此,我相信它比cv2更常用于收缩图像。INTER_LINEAR等 请尝试以下操作,而不是调整现有的大小:
img = cv2.resize(img11, None, fx=0.4, fy=0.3, interpolation=cv2.INTER_AREA)
另外,通过改变图像的纵横比(fx!=fy),你不是更难识别眼睛了吗?如果没有特殊原因,可以使用第二个position参数size显式选择目标大小。例如:
effective_but_smaller_size = (640, 480) # or whatever you find works
img = cv2.resize(img11, effective_but_smaller_size, interpolation=cv2.INTER_AREA)
等等,我会让你知道的