2016-12-30 373 views
1

我想在Python上用OpenCV检测手。
我工作的这个阈值的图像上:
Thresholded image

这就是轮廓drawed状态:
Contour drawed image

我想检测的手,但轮廓太大,它抓住了我的全身。
我需要这样的:
I need it like this


OpenCV分割轮廓

我的代码:

import cv2 
orImage = cv2.imread("f.png") 
image = cv2.cvtColor(orImage,cv2.COLOR_BGR2GRAY) 
image = cv2.blur(image,(15,15)) 
(_,img_th) = cv2.threshold(image,96,255,1) 
     (contours,_) = cv2.findContours(img_th, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 
for c in contours: 
     if cv2.contourArea(c) > 15: 
      x,y,w,h = cv2.boundingRect(c) 
      cv2.rectangle(image,(x-20,y-20),(x+w+20,y+h+20),(0,255,0),2) 
cv2.drawContours(image,contours,-1,(255,0,0),2) 
cv2.imwrite("hi.jpg",image) 




谢谢!

+0

要从身体的其余部分分离手轮廓,您需要使用阈值算法。你有实际的输入图像吗? –

+0

或者,也许你可以检测实际图像中的边缘,然后将其与轮廓图像重叠。 –

+0

是的,我愿意。 http://i.imgur.com/YOFXf9u.jpg但我想我需要像“最大面积” –

回答

2

我有一个解决方案(我从HERE一些帮助),它具有对图像处理专为OpenCV的用户带来了很多其他的精彩教程)

我先转换你已经上传到HSV色彩空间中的图像。

HSV = cv2.cvtColor(orimage, cv2.COLOR_BGR2HSV) 

我然后设置皮肤检测的大致范围内,一旦图像被转换为​​HSV颜色空间:

l = np.array([0, 48, 80], dtype = "uint8") 
u = np.array([20, 255, 255], dtype = "uint8") 

我然后应用到HSV图像此范围:

skinDetect = cv2.inRange(HSV, l, u) 

这是我得到什么(我也调整图像以使其变小):

enter image description here

现在,你可以找到的最大的在这个图像轮廓,然后进行形态学操作,以获得完美的手。

希望这会有所帮助。

+0

只是一个提醒,我提到的博客文章也有许多其他的真棒教程! –

+0

我刚刚遇到另一个解决方案,涉及YCrCb颜色空间可用[这个链接](http://stackoverflow.com/questions/14752006/computer-vision-masking-a-human-hand/14756351#14756351) –

+0

真棒的想法!这工作,谢谢! :) –