我正在更改OpenCV 3.0 Python代码,以通过使用凸包识别手指上的点在手指周围绘制轮廓来识别手势。
无论如何,该代码有效,但仅适用于深色(黑色)背景。该代码使用阈值对图像进行二值化处理,因此最亮的形状将是手(因此背景为黑色,而手的形状为白色)。
我如何更改阈值以将图像二值化以仅选择肤色而不是最亮的颜色?
例如,完成二值化后,视频流图像的黑色部分将是所有非肤色的颜色,而二值化图像的白色部分将是肤色的皮肤。
这是代码:
def readCamera(self):
_, self.original = self.cap.read()
self.original = cv2.flip(self.original, 1)
def threshold(self):
hsv = cv2.cvtColor(self.original, cv2.COLOR_BGR2HSV)
value = (31, 31)
blurred = cv2.GaussianBlur(hsv, value, 0)
_, self.thresholded = cv2.threshold(hsv[:,:,0], 0, 255,
cv2.THRESH_BINARY+cv2.THRESH_OTSU)
def extractContours(self):
_, self.contours, _ = cv2.findContours(self.thresholded.copy(),
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
最佳答案
将帧转换为HSV后,肤色会变绿色。在此图像上应用RGB滤镜以滤除该皮肤部分。如有必要,请使用跟踪栏,如下所示:
import cv2
def nothing(x): #needed for createTrackbar to work in python.
pass
cap = cv2.VideoCapture(0)
cv2.namedWindow('temp')
cv2.createTrackbar('bl', 'temp', 0, 255, nothing)
cv2.createTrackbar('gl', 'temp', 0, 255, nothing)
cv2.createTrackbar('rl', 'temp', 0, 255, nothing)
cv2.createTrackbar('bh', 'temp', 255, 255, nothing)
cv2.createTrackbar('gh', 'temp', 255, 255, nothing)
cv2.createTrackbar('rh', 'temp', 255, 255, nothing)
while true
ret,img=cap.read()#Read from source
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
bl_temp=cv2.getTrackbarPos('bl', 'temp')
gl_temp=cv2.getTrackbarPos('gl', 'temp')
rl_temp=cv2.getTrackbarPos('rl', 'temp')
bh_temp=cv2.getTrackbarPos('bh', 'temp')
gh_temp=cv2.getTrackbarPos('gh', 'temp')
rh_temp=cv2.getTrackbarPos('rh', 'temp')
thresh=cv2.inRange(hsv,(bl_temp,gl_temp,rl_temp),(bh_temp,gh_temp,rh_temp))
if(cv2.waitKey(10) & 0xFF == ord('b')):
break #break when b is pressed
cv2.imshow('Video', img)
cv2.imshow('thresh', thresh)