OpenCV:利用命令行进行人脸检测

3

我运行了这个(第一个)示例,它启动了我的笔记本电脑的网络摄像头,这样我就可以在屏幕上看到自己。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

我在Ubuntu 14.04 LTS上安装了OpenBr,并成功地在一张我自己的照片上运行了这个命令:

br - gui -algorithm ShowFaceDetection -enrollAll -enroll /home/nakkini/Desktop/myself.png

我在终端中运行的上述命令会显示我的照片并在我的脸周围绘制一个正方形(人脸检测),它还会用绿色突出显示我的眼睛。 我的梦想: 我想知道是否有一种方法可以将此命令与上面的简短程序结合起来,以便当启动网络摄像头时,我可以看到我的脸被绿色矩形包围? 我为什么需要这个? 我发现了纯OpenCV/Python的类似程序,但是出于后续需求,我需要更多的东西而不仅仅是简单的人脸检测,并且我自己判断,OpenBR将为我省去很多麻烦。这就是为什么我要寻找一种方法,在上述代码的内部首先运行命令行的原因。 提示: 代码中的“frame”对应于命令行中的“myself.png”。要解决的问题是尝试将“frame”传递到程序内的命令行中的“myself.png”的位置。
非常感谢您的帮助。
编辑: 经过修正@Xavier的解决方案的拼写错误后,我没有错误。但是程序并不按照我的意愿运行:
首先,摄像头启动并且我可以看到自己,但是我的脸没有被绿色矩形检测到。其次,我按任意键退出,但程序不退出:它显示了一个检测到我脸的图片。最后按一下键退出程序。我的目标是在摄像头运行期间看到我的脸被检测到。

1
你在-gui之间有一个空格,它应该是:br -gui ...而不是br - gui - berak
@berak 很好的观察,但我之前已经纠正了。谢谢。 - user4772964
@berak 如果你有时间,你可以看一下我的第三次编辑。谢谢 - user4772964
将问题分为两个部分:1)给定一个视频文件,进行人脸跟踪。2)将其插入视频摄像头。 - Ciro Santilli OurBigBook.com
2个回答

2

1
我已经使用Python中纯OpenCV能力运行了类似的代码。然而,我很想实现我所要求的内容。但是非常感谢您提供的有趣链接。 - user4772964

1
像这样应该可以工作。
import numpy as np
import cv2
import os

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        cv2.imwrite( "/home/nakkini/Desktop/myself.png", gray );
        os.system('br - gui -algorithm -ShowFaceDetection -enrollAll -enroll /home/nakkini/Desktop/myself.png')
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

非常感谢。当我在另一台机器上尝试后,我会让您知道的。但我想您想要写的是imread()而不是imwrite(),对吗? - user4772964
啊,是的,你说得对。我刚才遇到了一个关于“system”的错误,它没有被识别,但我会在互联网上查找一下...我想我找到了类似于“subprocess.Popen()”的东西。 - user4772964
1
忘记导入 os; os.system(...) - Xavier Combelle
不要忘记在脚本顶部导入 os。 - Xavier Combelle
是的,我已经导入了所有必要的东西。谢谢。如果你有时间,我在我的问题中编辑了我遇到的错误以及行为。谢谢。 - user4772964
显示剩余2条评论

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