2013-05-29 42 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