【问题标题】:how to store the location of a detected face opencv如何存储检测到的人脸opencv的位置
【发布时间】:2018-01-05 08:33:48
【问题描述】:

只要检测到人脸,我就可以使用for (x, y, w, h) in faces: 获取值,但在未检测到人脸后,我会丢失这些值。

我想绘制一个矩形来覆盖检测到最后一张人脸的区域并在那里停留一段时间,但是在没有检测到人脸的那一刻矩形消失了。

我尝试使用copy.copy() 将值传递给新变量,但矩形一直消失。

faces = faceCascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=3, minSize=(0, 0))

for (x, y, w, h) in faces:
    if x>0: x2 = copy.copy(x)
    if y>0: y2 = copy.copy(y)
    if w>0: w2 = copy.copy(w)
    if h>0: h2 = copy.copy(h)
    cv2.rectangle(img, (x2, y2), (x2+w2, y2+h2), (0, 0, 0), -1)

编辑: 对于那些想要更多上下文的人,我基本上想跟踪手部动作,我进行颜色分割以检测皮肤并且面部干扰了跟踪,因为有时 haar 检测器没有检测到影响手部位置估计的面部,这是我采取的第一种方法正在去除面部,我知道有更好的方法,但我是 OpenCV 新手。

我让它将值存储在一个列表中,

faces_t = [None]*4

while(cam.isOpened():

faces = faceCascade.detectMultiScale(grey, scaleFactor=1.3, minNeighbors=3, minSize=(0, 0))

for (x, y, w, h) in faces:
   faces_t.pop(0)
   faces_t.insert(0,x)
   faces_t.pop(1)
   faces_t.insert(1,y)
   faces_t.pop(2)
   faces_t.insert(2,w)
   faces_t.pop(3)
   faces_t.insert(3,w)

X1 = faces_t[0]
Y1 = faces_t[1]
W1 = faces_t[2]
H1 = faces_t[3]

if any(value is None for value in faces_t):
    pass
else:
    cv2.rectangle(skin_ycrcb, (X1-10, Y1-15), (X1+W1+10, Y1+H1+15), (0, 0, 0), -1)

【问题讨论】:

  • 我真的不认为这里有足够的代码作为上下文,你能提供更大类的一部分吗?
  • 您在 for 循环中复制到相同的变量...最后您将获得最后一个通过 if... 不知道为什么您使用 copy.copy 复制整数...此外,如果满足所有条件,你应该只做 1,或者如果一个组件中有 0,你可能会得到一个的一部分和另一个的一部分

标签: python opencv


【解决方案1】:

你可以用这个:

faces = faceCascade.detectMultiScale(gray, scaleFactor=1.3, 
minNeighbors=3, minSize=(0, 0))
(X1,Y1,W1,H1) = (0,0,0,0)
for (x, y, w, h) in faces:
    if (x,y,w,h) != (0,0,0,0):
       (X1,Y1,W1,H1) = (x,y,w,h)
    cv2.rectangle(img, (X1, Y1), (X1+W1, Y1+H1), (0, 0, 0), -1)

【讨论】:

  • 感谢您的回答,但它不起作用,我认为是因为值是整数,因此是不可变的,(X1,Y1,W1,H1) = (x,y,w,h) 不起作用
猜你喜欢
  • 2019-11-25
  • 2012-03-08
  • 2016-01-01
  • 2021-01-22
  • 2013-07-16
  • 2017-06-25
  • 2012-02-04
  • 2013-05-24
  • 1970-01-01
相关资源
最近更新 更多