本帖最后由 bgsdd 于 2022-8-27 19:23 编辑
起源对摄像头云台自动跟踪人脸感兴趣,百度琢磨了下:用PYTHON-OPENCV实现人脸检测,计算出人脸中心和画面中心的坐标是否重合,如果不重合就控制云台旋转到画面中心,来实现摄像头云台追踪人脸,通过 PYTHON serial 串口输出坐标给ARDUINO来驱动云台步进电机,发现接收PYTHON坐标负值的时候正常动作,接收坐标正值的时候电机不动 ,单独用ARDUINO 串口监视器调试的时候 正值和负值都可以正常动作
这是PYTHON输出部分,坐标输出显示正常:
人脸偏差坐标---- 149
人脸偏差坐标---- 99
人脸偏差坐标---- 12
人脸偏差坐标---- -18
人脸偏差坐标---- -49
人脸偏差坐标---- -92
人脸偏差坐标---- -102
这是PYTHON serial库输出部分,只弄了X(左右)方向:
x = int(480 - (xmin/2+xmax/2)) # 计算画面X方向画面中心和人脸中心的偏差
print("人脸偏差坐标----", (x)) # 打印出人脸中心和画面中心偏差
x = str(x) #坐标转化成STR类型以便发送ARDUINO编码格式
ser.write(x.encode("utf-8")) #发送ARDUINO 编码格式
这是ARDUINO部分,用来控制电机转动方向:
const int dir = 8; // 方向控制引脚
const int pul = 9; // 步进控制引脚
long val;//变量
void setup() {
Serial.begin(9600);
pinMode(dir, OUTPUT);//步进电机端口输出模式,步进电机部分:
pinMode(pul, OUTPUT);
}
void loop() {
if (Serial.available()) //等待接收串口数据,如果串口有数据,那么开始
{
val = Serial.parseInt();//串口接收数据转化为整数型并赋值给变量
if (val > 15) {//如果坐标偏离大于15,云台电机开始正转向图像中心调转
digitalWrite(dir, LOW);//电机正转
for (int i = 0; i < 5; i++) {//每一次调转电机5步
digitalWrite(pul, HIGH); //输出高脉冲
delayMicroseconds(2000); //电机转动速度
digitalWrite(pul, LOW); //输出低脉冲
delayMicroseconds(2000);
}
}
if (val < -15) {//如果坐标偏离小于-15,云台电机开始反转向图像中心调转
digitalWrite(dir, HIGH);//电机反转
for (int i = 0; i < 5; i++) {
digitalWrite(pul, HIGH);
delayMicroseconds(2000);
digitalWrite(pul, LOW);
delayMicroseconds(2000);
}
}
}
}
|