def calcHistogram(self,frameSmallHSV,inSideFace,hBins,sBins): #sets the Region of Interest (face) in HSV image cv.SetImageROI(frameSmallHSV, inSideFace); face = cv.CreateImage(cv.GetSize(frameSmallHSV),frameSmallHSV.depth,frameSmallHSV.nChannels); cv.Copy(frameSmallHSV, face); cv.ResetImageROI(frameSmallHSV); #get size of face area faceArea = face.height*face.width hist = hs_histogram(face) myHist = hist.getHist(hBins, sBins) (_, maxValue, _, _) = cv.GetMinMaxHistValue(myHist) hasHist = True myHistMat = cv.CreateMat(hBins, sBins, 1) for h in range(hBins): for s in range(sBins): binVal = cv.QueryHistValue_2D(myHist, h, s) myHistMat[h,s] = binVal return myHistMat,hasHist,maxValue
pt1 = (int(bestFaceX), int(bestFaceY)) pt2 = (int((bestFaceX + bestFaceW)), int((bestFaceY + bestFaceH))) cv.Rectangle(frameSmall, pt1, pt2, cv.RGB(0, 255, 0), 3, 8, 0) ################################### ########calculate histogram######## if biggestFace>0: #sets the Region of Interest (face) in HSV image cv.SetImageROI(frameSmallHSV, rect); face = cv.CreateImage(cv.GetSize(frameSmallHSV),frameSmallHSV.depth,frameSmallHSV.nChannels); cv.Copy(frameSmallHSV, face); cv.ResetImageROI(frameSmallHSV); #get size of face area faceArea = face.height*face.width hist = hs_histogram(face) myHist = hist.getHist(hBins, sBins) (_, maxValue, _, _) = cv.GetMinMaxHistValue(myHist) print "face detected >>> Histogram constructed" hasHist = True ################################### else: # if hist already calculated skinProbImg = cv.CreateImage(cv.GetSize(frameSmallHSV),8,1); hueImg = cv.CreateMat(frameSmallHSV.height, frameSmallHSV.width, cv.CV_8UC1) satImg = cv.CreateMat(frameSmallHSV.height, frameSmallHSV.width, cv.CV_8UC1) cv.Split(frameSmallHSV, hueImg, satImg, None, None) binSum = face.height*face.width maxProbInt = 0 for x in range(0, frameSmallHSV.height):
(bestFaceX + bestFaceW)), int((bestFaceY + bestFaceH))) cv.Rectangle(frameSmall, pt1, pt2, cv.RGB(0, 255, 0), 3, 8, 0) ################################### ########calculate histogram######## if biggestFace > 0: #sets the Region of Interest (face) in HSV image cv.SetImageROI(frameSmallHSV, rect) face = cv.CreateImage(cv.GetSize(frameSmallHSV), frameSmallHSV.depth, frameSmallHSV.nChannels) cv.Copy(frameSmallHSV, face) cv.ResetImageROI(frameSmallHSV) #get size of face area faceArea = face.height * face.width hist = hs_histogram(face) myHist = hist.getHist(hBins, sBins) (_, maxValue, _, _) = cv.GetMinMaxHistValue(myHist) print "face detected >>> Histogram constructed" hasHist = True ################################### else: # if hist already calculated skinProbImg = cv.CreateImage(cv.GetSize(frameSmallHSV), 8, 1) hueImg = cv.CreateMat(frameSmallHSV.height, frameSmallHSV.width, cv.CV_8UC1) satImg = cv.CreateMat(frameSmallHSV.height, frameSmallHSV.width, cv.CV_8UC1) cv.Split(frameSmallHSV, hueImg, satImg, None, None) binSum = face.height * face.width
def __init__(self,img,hasColor): cascade = cv.Load("haarcascades\haarcascade_frontalface_alt.xml") rect = (0,0,1,1) # allocate temporary images gray = cv.CreateImage((img.width,img.height), 8, 1) # convert color input image to grayscale cv.CvtColor(img, gray, cv.CV_BGR2GRAY) # scale input image for faster processing cv.EqualizeHist(gray, gray) faces = cv.HaarDetectObjects(gray, cascade, cv.CreateMemStorage(0), haar_scale, min_neighbors, haar_flags, min_size) if faces: for ((x, y, w, h), n) in faces: faceX = x faceY = y faceW = w faceH = h reScale = 0.2 horScl = int(faceW * reScale) verScl = int(faceH * reScale) rect = (faceX+horScl,faceY+verScl,faceW-(horScl*2),faceH-(verScl*2)) pt1 = (int(x), int(y)) pt2 = (int((x + w)), int((y + h))) cv.Rectangle(img, pt1, pt2, cv.RGB(255, 0, 0), 3, 8, 0) cv.ShowImage("result", img) #sets the Region of Interest cv.SetImageROI(img, rect); face = cv.CreateImage(cv.GetSize(img),img.depth,img.nChannels); #copy subimage */ cv.Copy(img, face); #always reset the Region of Interest */ cv.ResetImageROI(img); cv.ShowImage("resultFace", face) hist = hs_histogram(face) myHist = hist.getHist() cv.ShowImage("histImg", myHist) #original [histHue,histSat] = hist.getMinMax() print "hueBin: %d >>> satBin:%d" % (histHue,histSat) #as initialized in hs_histogram.py h_bins = 9 s_bins = 16 hueFromHist = int(int((180/9)*histHue)+int((180/9)*histHue+1)/2) satFromHist = int(int((255/9)*histSat)+int((255/9)*histSat+1)/2) if not hasColor: global H global S H = hueFromHist S = satFromHist hasColor=1