基于OpenCV-Python的摄像头人脸检测追踪控制系统
基于OpenCV-Python的摄像头人脸检测追踪控制系统
资源:https://download.csdn.net/download/weixin\_53403301/25496828
采用OpenCV-Python进行人脸识别 并计算出相对位置
输出左右中三种信号
可外接单片机设备控制步进电机并实现摄像头自动追踪
程序测试如图:
左
中
右
单片机及步进电机系统仿真图:
Python程序如下:
import cv2
import threading
cap = cv2.VideoCapture(0) # 开启摄像头
# 循环读取图像
while True:
ok, faceImg = cap.read() # 读取摄像头图像
if ok is False:
print('无法读取到摄像头!')
break
# faceImg = img
high=faceImg.shape[0]
width=faceImg.shape[1]
# print(width,high)
gray = cv2.cvtColor(faceImg,cv2.COLOR_BGR2GRAY)
classifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 加载人脸识别分类器
# 官方已有的分类器 https://github.com/opencv/opencv/tree/master/data/haarcascades
# github的不好下载, 可以从码云上找
# Python\Python38-32\Lib\site-packages\cv2\data 这个目录下也有
# 识别器进行识别
def track():
faceRects = classifier.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32, 32))
if len(faceRects):
for faceRect in faceRects:
x,y,w,h = faceRect
# 框选出人脸 最后一个参数2是框线宽度
cv2.rectangle(faceImg,(x, y), (x + w, y + h), (0,255,0), 2)
print(x+w/2)
if x+w/2 > width/2+50:
print("Left")
elif x+w/2 < width/2-50:
print("Right")
elif width/2-50 < x+w/2 < width/2+50:
print("Central")
# # 转换灰色
# gray = cv2.cvtColor(faceImg,cv2.COLOR_BGR2GRAY)
#
# # 加载人脸识别分类器
# # 官方已有的分类器 https://github.com/opencv/opencv/tree/master/data/haarcascades
# # github的不好下载, 可以从码云上找
# # Python\Python38-32\Lib\site-packages\cv2\data 这个目录下也有
# classifier = cv2.CascadeClassifier('haarcascade_eye.xml')
# color = (255,0,0)
#
# # 识别器进行识别
# faceRects = classifier.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32, 32))
#
# if len(faceRects):
# for faceRect in faceRects:
# x,y,w,h = faceRect
# # 框选出人脸 最后一个参数2是框线宽度
# cv2.rectangle(faceImg,(x, y), (x + h, y + w), color, 2)
#
#
#faceImg= cv2.cvtColor(faceImg,cv2.COLOR_RGB2BGR)
cv2.imshow("faceImg",faceImg)
# 展示图像
thread = threading.Thread(target=track)
thread.start()
k = cv2.waitKey(10) # 键盘值
if k == 27: # 通过esc键退出摄像
break
# 关闭摄像头
cap.release()
cv2.destroyAllWindows()
单片机C语言程序如下:
#include <reg51.h>
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
unsigned char BJDJ[]={
0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
unsigned char i;
void delay(unsigned int time){
unsigned int j=0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
void zd(void){
for(i=0;i<8;i++){
P2=BJDJ[i];
delay(100);
}
}
void fzd(void){
for(i=8;i>0;i--){
P2=BJDJ[i];
delay(100);
}
}
void zd2(void){
for(i=0;i<8;i++){
P2=BJDJ[i];
delay(10);
}
}
void fzd2(void){
for(i=8;i>0;i--){
P2=BJDJ[i];
delay(10);
}
}
void main(void){
while(!key3){
while(!key1){
if (!key2)zd2();
else zd();
}
while(key1){
if (!key2) fzd2();
else fzd();
}
}
}
改进单片机系统程序(由外部中断控制):
#include <reg51.h>
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
unsigned char BJDJ[]={
0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
unsigned char i;
void delay(unsigned int time){
unsigned int j=0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
void main(void)
{
EA=1; //×ÜÖжϿªÆô
EX0=1; //ÍⲿÖжÏ1ÔÊÐí
IT0=1; //ÖжÏ1 ϽµÑØ´¥·¢
EX1=1;
IT1=1;
P2=0x0;
}
void exter0()interrupt 0 //ÍⲿÖжÏ0
{
for(i=0;i<8;i++){
P2=BJDJ[i];
delay(100);
}
}
void exter1()interrupt 2 //ÍⲿÖжÏ1
{
for(i=8;i>0;i--){
P2=BJDJ[i];
delay(100);
}
}
仿真图:
还没有评论,来说两句吧...