2013-05-15 128 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