OpenCV和Python:如何使用cv2.surf()函数并添加掩码?

3

我是opencv和python的新手,正在尝试在图像中收集人脸的关键点和描述符。

我使用HAAR级联分类器与前置面模板来查找图像中的人脸。HAAR级联会给我一个标记图像中人脸位置的坐标列表。我想在这些坐标处生成一个“掩码”,以便我可以使用cv2.surf()提取掩码区域内的关键点和描述符。

我不知道如何创建该掩码。

请尝试使用此照片作为示例进行操作。

到目前为止,这是代码:

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)

接下来,我想使用faceRegions中的掩码进行SURF特征提取。假设faceRegions如下所示:

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

imgg中发现了三个面孔,因此我想创建三个单独的掩膜,位于它们特定的位置,并具有它们特定的宽度和高度。然后让cv2.surf()只在遮罩区域中查找。我该如何实现?

1个回答

4

faceRegions中的数据表示人脸的x,y,width,height。因此,您可以使用这些坐标简单地设置感兴趣区域(ROI),并将该矩形作为图像发送给SURF函数。

例如:

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

现在你可以将face1传递给cv2.SURF(),而不是传递整个图像。

是的,我也想到了并且已经这样做了。谢谢你。不过,你能否想到一种在图像的指定区域放置掩模的方法? - samkhan13
如果这个方法对你有用,你可以接受答案并关闭它。同样,你也可以使用相同的过程来放置它。例如 img2[y:y+height, x:x+width] = face1,其中img2是你的新图像,y、x是新位置,但宽度和高度应与face1相同。 - Abid Rahman K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接