使用python和Opencv进行多处理或多线程处理以检测人脸

使用python和Opencv进行多处理或多线程处理以检测人脸,python,opencv,raspberry-pi3,raspbian,Python,Opencv,Raspberry Pi3,Raspbian,最近,我正在使用OPENCV+PYTHON开发raspberry pi 3(OS raspbian),以便在实时摄像机上检测人脸。我在树莓pi3上看到检测到的人脸使用opencv速度非常慢,大约4-5 FPS/s。所以我想知道我可以使用多线程或多处理来加速FPS吗?如果可以,我该怎么做 请帮帮我,任何想法都将不胜感激。谢谢是的,您可以多线程处理该过程。 在Python2或Python3中使用该库 下面是一个简单的例子 除了你的主线 只有一个线程操作相机并不断更新最新帧,在本例中是全局的 def

最近,我正在使用OPENCV+PYTHON开发raspberry pi 3(OS raspbian),以便在实时摄像机上检测人脸。我在树莓pi3上看到检测到的人脸使用opencv速度非常慢,大约4-5 FPS/s。所以我想知道我可以使用多线程或多处理来加速FPS吗?如果可以,我该怎么做


请帮帮我,任何想法都将不胜感激。谢谢

是的,您可以多线程处理该过程。 在Python2或Python3中使用该库

下面是一个简单的例子

除了你的主线

只有一个线程操作相机并不断更新最新帧,在本例中是全局的

def camera_thread():       
    cam = cv2.VideoCapture(1)
    _ret, self.image = cam.read()
    cv2.imshow('camera', self.image)
第二个线程可以使用最新的帧从模型运行推断

可选的第三个选项可能会在面上绘制边界框,或执行其他操作等

在这种情况下,第2个和第3个线程之间可能需要互斥锁,因为只有在从模型获得输出后才能开始绘制框。这允许您的第二个线程开始推断下一帧,而无需等待其他线程


上述示例将产生平滑的视频输出,而推断稍微滞后。如果您不确定多线程是如何工作的,我建议您先阅读基础知识

是的,您可以多线程处理该进程。 在Python2或Python3中使用该库

下面是一个简单的例子

除了你的主线

只有一个线程操作相机并不断更新最新帧,在本例中是全局的

def camera_thread():       
    cam = cv2.VideoCapture(1)
    _ret, self.image = cam.read()
    cv2.imshow('camera', self.image)
第二个线程可以使用最新的帧从模型运行推断

可选的第三个选项可能会在面上绘制边界框,或执行其他操作等

在这种情况下,第2个和第3个线程之间可能需要互斥锁,因为只有在从模型获得输出后才能开始绘制框。这允许您的第二个线程开始推断下一帧,而无需等待其他线程


上述示例将产生平滑的视频输出,而推断稍微滞后。如果您不确定多线程是如何工作的,我建议您先阅读基础知识

更新。我使用单独的线程从相机中捕获图像,我看不到FPS比串行的速度有任何提高。。。请看我的密码

import threading
import time
import cv2
import numpy as np
class myThread (threading.Thread):
    def __init__(self, src):
        print("thread -------------init-------------")
        threading.Thread.__init__(self)
        self.cap = cv2.VideoCapture(src)
        self.stop = False
    def run(self):
        while(self.stop == False):
            self.ret, self.frame = self.cap.read()

    def Stop(self):
        self.cap.release()
        self.stop = True

    def read(self):
        return self.ret, self.frame

recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);

thread = myThread(0)
thread.start()
time.sleep(1)

start = time.time()
frames = 0
font = cv2.FONT_HERSHEY_SIMPLEX
cap = cv2.VideoCapture(0)
while(True):
    ret, frame = thread.read()
    frame = cv2.resize(frame, (640, 480))
    frames += 1
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(gray, 1.2, 5)
    for(x,y,w,h) in faces:
        # Create rectangle around the face
        cv2.rectangle(frame, (x-20,y-20), (x+w+20,y+h+20), (0,255,0), 4)
        Id, con = recognizer.predict(gray[y:y+h,x:x+w])
        print(Id, con)

        # Check the ID if exist
        if(con < 60):
            if(Id == 1):
                Id = "HUY"
            if(Id == 2):
                Id = "HOA"
        #If not exist, then it is Unknown
        else:
            #print(Id)
            Id = "Unknow"

        # Put text describe who is in the picture
        cv2.rectangle(frame, (x-22,y-90), (x+w+22, y-22), (0,255,0), -1)
        cv2.putText(frame, str(Id), (x,y-40), font, 2, (255,255,255), 3)  

    if cv2.waitKey(10) & 0xFF == ord('q'):
        thread.Stop()
        break
    cv2.imshow("frame", frame) 
end = time.time()
second = end - start
print("second:", + second)
print(frames/second)
cv2.destroyAllWindows()
导入线程
导入时间
进口cv2
将numpy作为np导入
类myThread(threading.Thread):
定义初始化(自我,src):
打印(“线程------------------init------------------”)
threading.Thread.\uuuuu init\uuuuuu(自)
self.cap=cv2.VideoCapture(src)
self.stop=False
def运行(自):
while(self.stop==False):
self.ret,self.frame=self.cap.read()
def停止(自):
self.cap.release()
self.stop=True
def读取(自):
返回self.ret,self.frame
recognizer=cv2.face.LBPHFaceRecognizer_create()
识别器.read('trainer/trainer.yml'))
cascadePath=“haarcascade\u frontalface\u default.xml”
faceCascade=cv2.级联分类器(级联路径);
线程=myThread(0)
thread.start()
时间。睡眠(1)
开始=时间。时间()
帧=0
font=cv2.font\u HERSHEY\u SIMPLEX
cap=cv2.视频捕获(0)
虽然(正确):
ret,frame=thread.read()
frame=cv2。调整大小(frame,(640480))
帧+=1
灰色=cv2.CVT颜色(边框,cv2.COLOR\u BGR2GRAY)
面=面级联。检测多尺度(灰色,1.2,5)
对于面中的(x,y,w,h):
#围绕面创建矩形
cv2.矩形(框架,(x-20,y-20),(x+w+20,y+h+20),(0255,0),4)
Id,con=recognizer.predict(灰色[y:y+h,x:x+w])
打印(Id、con)
#如果存在,请检查ID
如果(con<60):
如果(Id==1):
Id=“HUY”
如果(Id==2):
Id=“HOA”
#如果不存在,那么它是未知的
其他:
#打印(Id)
Id=“未知”
#输入文字描述图片中的人物
cv2.矩形(框架,(x-22,y-90),(x+w+22,y-22),(0255,0),-1)
cv2.putText(框架,str(Id),(x,y-40),字体,2,(255255),3)
如果cv2.waitKey(10)&0xFF==ord('q'):
thread.Stop()
打破
cv2.imshow(“帧”,帧)
end=time.time()
第二个=结束-开始
打印(“秒:,+秒)
打印(帧/秒)
cv2.destroyAllWindows()

更新。我使用单独的线程从相机中捕获图像,我看不到FPS比串行的速度有任何提高。。。请看我的密码

import threading
import time
import cv2
import numpy as np
class myThread (threading.Thread):
    def __init__(self, src):
        print("thread -------------init-------------")
        threading.Thread.__init__(self)
        self.cap = cv2.VideoCapture(src)
        self.stop = False
    def run(self):
        while(self.stop == False):
            self.ret, self.frame = self.cap.read()

    def Stop(self):
        self.cap.release()
        self.stop = True

    def read(self):
        return self.ret, self.frame

recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);

thread = myThread(0)
thread.start()
time.sleep(1)

start = time.time()
frames = 0
font = cv2.FONT_HERSHEY_SIMPLEX
cap = cv2.VideoCapture(0)
while(True):
    ret, frame = thread.read()
    frame = cv2.resize(frame, (640, 480))
    frames += 1
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(gray, 1.2, 5)
    for(x,y,w,h) in faces:
        # Create rectangle around the face
        cv2.rectangle(frame, (x-20,y-20), (x+w+20,y+h+20), (0,255,0), 4)
        Id, con = recognizer.predict(gray[y:y+h,x:x+w])
        print(Id, con)

        # Check the ID if exist
        if(con < 60):
            if(Id == 1):
                Id = "HUY"
            if(Id == 2):
                Id = "HOA"
        #If not exist, then it is Unknown
        else:
            #print(Id)
            Id = "Unknow"

        # Put text describe who is in the picture
        cv2.rectangle(frame, (x-22,y-90), (x+w+22, y-22), (0,255,0), -1)
        cv2.putText(frame, str(Id), (x,y-40), font, 2, (255,255,255), 3)  

    if cv2.waitKey(10) & 0xFF == ord('q'):
        thread.Stop()
        break
    cv2.imshow("frame", frame) 
end = time.time()
second = end - start
print("second:", + second)
print(frames/second)
cv2.destroyAllWindows()
导入线程
导入时间
进口cv2
将numpy作为np导入
类myThread(threading.Thread):
定义初始化(自我,src):
打印(“线程------------------init------------------”)
threading.Thread.\uuuuu init\uuuuuu(自)
self.cap=cv2.VideoCapture(src)
self.stop=False
def运行(自):
while(self.stop==False):
self.ret,self.frame=self.cap.read()
def停止(自):
self.cap.release()
self.stop=True
def读取(自):
返回self.ret,self.frame
recognizer=cv2.face.LBPHFaceRecognizer_create()
识别器.read('trainer/trainer.yml'))
cascadePath=“haarcascade\u frontalface\u default.xml”
faceCascade=cv2.级联分类器(级联路径);
线程=myThread(0)
thread.start()
时间。睡眠(1)
开始=时间。时间()
帧=0
font=cv2.font\u HERSHEY\u SIMPLEX
cap=cv2.视频捕获(0)
虽然(正确):
ret,frame=thread.read()
frame=cv2。调整大小(frame,(640480))
帧+=1
灰色=cv2.CVT颜色(边框,cv2.COLOR\u BGR2GRAY)
面=面级联。检测多尺度(灰色,1.2,5)
对于面中的(x,y,w,h):
#围绕面创建矩形
cv2.矩形(框架,(x-20,y-20),(x+w+20,y+h+20),(0255,0),4)
Id,con=recognizer.predict(灰色[y:y+h,x:x+w])
打印(Id、con)
#如果存在,请检查ID
如果(con<60):
如果(Id==1):
Id=“HUY”
如果(Id==2):
Id=“HOA”
#如果不存在,那么它就是我