一、实现效果
给视频设定一个电子围栏,当人体的某个特征点出现在该区域时进行相应记录提示。
紫色区域为电子围栏,当人脸进入电子围栏之后开始报警,并可以做相关日志记录和视频帧截取
二、实现方法
(使用人脸识别调试,使用openpose部署)
1.添加一个电子围栏区域
#添加电子围栏 cv2.rectangle(frame, (0,0), (20,20), color, 2)
#提示文本
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(10,500),font,4,(255,255,255),2)
#参数:文字,位置,字体cv2.putText()可以查看,字号,文字属性
2.输出手的特征点坐标
3.实现判断手是否处于电子围栏区域的判断语句
4.添加提示框和提示文字
三、具体实现步骤
1.添加一个电子围栏区域
2.输出手的特征点坐标
3.实现判断手是否处于电子围栏区域的判断语句
4.添加提示框和提示文字
参考代码(路径自己设置)
import cv2 def CatchUsbVideo(window_name, camera_idx): cv2.namedWindow(window_name) #视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头 cap = cv2.VideoCapture(camera_idx) #告诉OpenCV使用人脸识别分类器 #classfier = cv2.CascadeClassifier("D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml") classfier = cv2.CascadeClassifier("F:/software/anaconda/installdocument/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml") #识别出人脸后要画的边框的颜色,RGB格式 color = (0, 255, 0) while cap.isOpened(): ok, frame = cap.read() #读取一帧数据 if not ok: break #将当前帧转换成灰度图像 grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #添加电子围栏 #定义电子围栏位置 lx=200 ly=150 rx=250 ry=200 cv2.rectangle(frame, (lx,ly), (rx,ry), (225,0,225), 2) #添加提示性文字 font=cv2.FONT_HERSHEY_SIMPLEX #cv2.putText(frame,'Replace fire extinguisher',(0,101),font,1,(25,25,250),2) #人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数 faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32)) #gray是待检测图像,scaleFactor表示每次图像尺寸减小的比例, minNeighbors目标至少要被检测到3次才算是真的目标 #minSize为目标的最小尺寸 if len(faceRects) > 0: #大于0则检测到人脸 for faceRect in faceRects: #单独框出每一张人脸 x, y, w, h = faceRect #x、y分别表示面部左上角坐标,w h是脸的宽和高 #cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2) cv2.rectangle(frame, (x,y), (x + w, y + h ), color, 2) #显示人脸坐标 cv2.putText(frame,str(faceRect),(x,y),font,1,(25,25,250),2) #显示人脸坐标 #添加电子区域判断语句 if (x<rx and x>lx and y>ly and y<ry) : cv2.putText(frame,'Replace fire extinguisher',(0,101),font,1,(25,25,250),2) #显示图像 cv2.imshow(window_name, frame) c = cv2.waitKey(10) if c & 0xFF == ord('q'): break #释放摄像头并销毁所有窗口 cap.release() cv2.destroyAllWindows() if __name__ == '__main__': CatchUsbVideo("find face", 0)