2016-12-30 439 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

真棒的想法!這工作,謝謝! :) –