2014-02-27 43 views
2

我正在尝试使用Python在Open CV中进行脸部和眼部检测的代码。该代码适用于2848 X 4272的图像大小,甚至当我将其大小调整为0.5时。但是,无论何时我用其他因素(如0.2,0.4等)调整它的大小,它都会给眼睛带来模棱两可的结果(例如前额,鼻子的几个区域)。在这种情况下,我无法获得所有图像大小的通用代码。是否有任何代码,以便我可以在任何图像尺寸下获得正确的检测结果,因为处理这些大图像非常困难。该代码是这样当图像大小调整时,脸部和眼睛检测的模糊结果

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 

回答

1

这是合乎逻辑的图像变得越来越小,变得难以从鼻子区分的眼睛,例如。所以除非你从根本上理解你的图像分析功能在寻找什么(我没有),否则很难知道缩小图像尺寸的最佳方式,同时保留分析所需的信息类型。

话虽如此,我相信cv2.INTER_AREA用于除cv2.INTER_LINEAR

更普遍萎缩的图像试试这个,而不是调整大小您有:

img = cv2.resize(img11, None, fx=0.4, fy=0.3, interpolation=cv2.INTER_AREA) 

而且,你不是使它难以通过改变图像的宽高比来识别眼睛(fx!= fy)?如果你没有特别的理由,你可以用第二个位置参数size来显式选择目标大小。例如:

effective_but_smaller_size = (640, 480) # or whatever you find works 
img = cv2.resize(img11, effective_but_smaller_size, interpolation=cv2.INTER_AREA) 
+0

只是等待我会试着让你知道 – Anuradha