2013-05-15 143 views
1

我正在研究python中的一個小程序來估計指向手勢與單眼相機的2D圖片的方向,我使用的是OpenCV 2.3。 我知道這有點棘手,但我很積極! :) 我的做法是最前一頁使用人臉檢測,檢測我敢肯定有很多的皮膚成的區域:從色相飽和度直方圖皮膚檢測 - OpenCV Python

img = cv2.imread("/home/max/recordings/cameras/imageTEST.jpg",1) 
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 
hc1 = cv2.CascadeClassifier("/home/max/haarcascade_frontalface_alt.xml") 
faces1 = hc1.detectMultiScale(img) 
for (x,y,w,h) in faces1: 
    cv2.rectangle(img, (x,y), (x+w,y+h), 255) 
crop_img = img[y+2:y+w, x+2:x+h] 

我真的想,因爲我希望我的檢測是使用這種方法對光線變化強勁。然後,我計算檢測到的面部圖像的色調,飽和度直方圖進行逆投影:

roihist = cv2.calcHist([crop_img],[0,1], None, [180, 256], [0, 180, 0, 256]) 
dst = cv2.calcBackProject([img],[0,1],roihist,[0,180,0,256],1) 

最後,我將能夠以二進制化利用閾值的畫面和跟蹤頭部和手部斑點估計指向的方向。 我的代碼沒問題,但皮膚沒有檢測到... 我在做什麼錯了? Thx爲您提供幫助!

最大

+0

這可以幫助你.. http://www.shervinemami.info/blobs.html – 2vision2

+0

THX的鏈接!不幸的是,即使我在S和V上應用了一些閾值,我的檢測仍然很差。它看起來像ROI(即臉部)的直方圖沒有正確地用於背投... –

回答

0

您是否嘗試過使用YCbCr格式的Cr通道?當我以前使用膚色進行手部檢測時,我對Cr有一些好運。此外,還有this paper,它使用一個很好的方法來檢測手。但請記住,只要您使用膚色,檢測將不適用於所有手,但可以針對給定用戶或一羣用戶進行調整。

0

最近我一直在研究網絡上的opencv示例(只是基本的東西)。我已經從人臉識別(有趣的,但是我喜歡的太黑框)移到手動選擇HSV空間中的roi,然後使用'camshift'來跟蹤。我仍然得到了不理解的變量結果,因此我還繪製了所有中間處理窗口,例如hsv圖像和反投影圖像,還繪製了窗口上的直方圖。突然間一切都清楚了 - 你可以看到計算機正在嘗試使用什麼。

這是我的python3.4的工作代碼,opencv3。您可以手動選擇皮膚。主要關注我在網上找到的其他例子。

「cv2.calcBAckProject」函數很好地剔除了皮膚特徵。

hsv and backproject

import numpy as np 
 
import cv2 
 

 
roiPts = [] 
 
track_mode = False 
 
termination = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1) 
 
roiBox = None 
 
kernel = np.ones((5, 5), np.uint8) 
 
frame_width_in_px = 640 
 
number_of_histogram_elements=16 
 

 
def selectROI(event, x,y,flags,param): 
 
    global track_mode, roiPts 
 

 
    if (event == cv2.EVENT_LBUTTONDOWN) and (len(roiPts)==4): #reselecting ROI points so take out of tracking mode and empty current roipoints 
 
     roiPts=[] 
 
     track_mode = False 
 
    if (event==cv2.EVENT_LBUTTONDOWN) and (len(roiPts) < 4): #ROI point selection 
 
     roiPts.append([x, y]) 
 

 
cap = cv2.VideoCapture(0) 
 
cv2.namedWindow("frame") 
 
cv2.setMouseCallback("frame", selectROI) 
 

 
while True: 
 
    ret, frame = cap.read() 
 

 
    if len(roiPts)<=4 and len(roiPts)>0: 
 
     for x,y in roiPts: 
 
      cv2.circle(frame, (x,y), 4, (0, 255, 0), 1) # draw small circle for each roi click 
 

 
    if len(roiPts)==4 and track_mode==False: #initialize the camshift 
 
     # convert the selected points to a box shape 
 
     roiBox = np.array(roiPts, dtype=np.int32) 
 
     s = roiBox.sum(axis=1) 
 
     tl = roiBox[np.argmin(s)] 
 
     br = roiBox[np.argmax(s)] 
 

 
     #extract the roi from the image and calculate the histograme 
 
     roi = frame[tl[1]:br[1], tl[0]:br[0]] 
 
     roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) # 
 
     roiHist = cv2.calcHist([roi], [0], None, [number_of_histogram_elements], [0, 180]) 
 
     roiHist = cv2.normalize(roiHist, roiHist, 0, 255, cv2.NORM_MINMAX) 
 
     roiBox = (tl[0], tl[1], br[0], br[1]) 
 
     track_mode = True #ready for camshift 
 

 
    if track_mode == True: #tracking mode 
 
     hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
 
     backProj = cv2.calcBackProject([hsv], [0], roiHist, [0, 180], 1) 
 
     #perfrom some noise reduction and smoothing 
 
     erosion = cv2.erode(backProj, kernel, iterations=2) 
 
     dilate = cv2.dilate(erosion, kernel, iterations=2) 
 
     (r, roiBox) = cv2.CamShift(dilate, roiBox, termination) #this takes prev roiBox and calculates the new roiBox 
 
     pts = np.int0(cv2.boxPoints(r)) 
 
     cv2.polylines(frame, [pts], True, (0, 255, 0), 2) #tracking box 
 
     cv2.polylines(backProj, [pts], True, (0, 255, 0), 2) #tracking box 
 
     cv2.polylines(dilate, [pts], True, (0, 255, 0), 2) #tracking box 
 
     cv2.polylines(hsv, [pts], True, (0, 255, 0), 2) #tracking box 
 

 
     # plot histogram polyline across the windows 
 
     x = np.linspace(0,640,number_of_histogram_elements,dtype=np.int32) 
 
     y = roiHist.flatten().astype(np.int32, copy=False)-255 #note frame height needs to be greater than 255 which is the max histo value 
 
     y=np.absolute(y) 
 
     pts2 = np.stack((x, y), axis=1) 
 
     cv2.polylines(frame, [pts2], False, (0, 255, 0), 2) 
 
     cv2.polylines(hsv, [pts2], False, (0, 255, 0), 2) 
 

 
     cv2.imshow("backproject", backProj) 
 
     cv2.imshow("dilate", dilate) 
 
     cv2.imshow("hsv", hsv) 
 

 
    cv2.imshow("frame", frame) 
 

 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
 
     break 
 

 
# When everything done, release the capture 
 
cap.release() 
 
cv2.destroyAllWindows()

+0

哦,臭蟲。我3年太晚了。 – Ninga