2013-05-29 77 views
2

我是opencv和python的新手,並且試圖收集圖像中關鍵點和描述符。opencv和python:如何使用cv2.surf()和掩碼

我使用HAAR級聯分類器和正面人臉模板在圖像中查找人臉。 HAAR級聯給我一個標記圖像中面部的座標列表。我想在這些座標上生成一個「蒙版」,以便我可以使用cv2.surf()來提取蒙版區域內的關鍵點和描述符。

我不知道如何創建該掩碼。

嘗試this photo作爲一個例子來工作。

這是迄今爲止代碼:

import cv2 
import numpy as np 

# Load image and convert to grayscale 
img = cv2.imread('testPhoto.jpg') 
imgg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

# Look for faces in the image 
cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml') 
faceRegions = cascade.detectMultiScale(imgg) 

在此之後,我想做到SURF提取使用faceRegions口罩。假設faceRegions看起來像這樣:

array([[488, 163, 91, 91], 
     [357, 184, 93, 93], 
     [154, 78, 107, 107]], dtype=int32) 

有在imgg發現的三個面,所以我想創建他們的具體位置三個獨立的口罩其特定的寬度和高度。然後cv2.surf()只看在蒙面的地區。我怎樣才能做到這一點?

回答

3

faceRegions你得到了表示x,y,width,height的面孔。因此,您可以簡單地使用這些座標設置ROI(感興趣區域),並將該矩形作爲圖像發送到SURF功能。

對於如:

face1 = imgg[y:y+height, x:x+width] 

現在,你可以通過這個face1到cv2.SURF()而不是傳遞的完整圖像。

+0

是的,我想了很多,做到了。謝謝。儘管你可以想辦法在圖像的特定區域放置蒙版嗎? – samkhan13

+0

如果它適合您,您可以接受答案並關閉它。另外,您可以使用相同的過程來放置它。例如'img2 [y:y + height,x:x + width] = face1'其中img2是您的新圖像,y,x是新位置,但寬度和高度應與您的face1相同。 –

+0

是的,我猜這是最簡單的方法。再次感謝你 :) – samkhan13