作品介绍: :
作品介绍:基于Arduino UNO的云台与OpenMV摄像头追踪系统**。
关键组件:
1. Arduino UNO: 作为主控制器,负责控制云台的运动和与OpenMV模块的通信。
2. OpenMV模块:这是一种基于ARM处理器的高性能计算机视觉模块,能够进行实时图像处理和目标识别。它通过串口与Arduino通信,将处理后的图像信息传送给云台控制系统。
3. 舵机云台: 用于安装摄像头和调整其方向。Arduino通过PWM信号控制舵机,使摄像头能够在水平和垂直方向上进行精确的旋转。
4. 摄像头:通常采用OpenMV内置的摄像头或外部USB摄像头,用于捕获环境中的图像,提供给OpenMV模块进行处理。
工作原理:
1. 图像捕获与处理:摄像头捕获环境中的图像,传送给OpenMV模块。OpenMV模块通过算法处理图像,识别并定位需要追踪的目标。
2. 目标追踪算法:OpenMV模块使用预先定义的算法(如色彩追踪、Haar级联检测等)来识别目标物体的位置。一旦目标被识别和定位,OpenMV将目标的坐标信息发送给Arduino UNO。
3. 云台控制:Arduino UNO接收到OpenMV发送的目标坐标信息后,计算云台需要调整的角度和方向。然后通过控制舵机云台的PWM信号,使摄像头对准目标物体。
4. 实时调整与反馈:系统通过持续的图像处理和云台调整,实现对目标物体的实时追踪和跟随。任何目标位置的变化都会导致云台重新计算并调整。
应用领域:
这种基于Arduino UNO和OpenMV的云台与摄像头追踪系统可以广泛应用于以下领域:
自动化监控系统:用于跟踪和监控特定区域内的活动或人员。
摄影与录像:在拍摄视频或拍摄静态图像时,保持摄像机对焦在特定目标上。
机器人导航:在机器人技术中,用于避障、追踪运动目标等。
一、硬件部分:
1.材料:一个openmv,一个二自由度的云台
![](https://i-blog.csdnimg.cn/direct/a8eeea8142ec4ba093e5d803cfe14ecb.jpeg)
2.AdruinoUNO开发板
二、软件部分:
1.AdruinoUNO部分:用于云台的控制和接收openmv传来的数据,并进行移动
#include <Servo.h> //加载文件库
#include <SoftwareSerial.h>
int pos = 0;
Servo myservo;
SoftwareSerial mySerial(2,3);//RX=2,TX=3
int p,m;
void setup(){
Serial.begin(115200);
mySerial.begin(115200);
myservo.attach(9, 500, 2500);
}
void loop(){
while (Serial.available() > 0) { // 串口收到字符数大于零。
p = Serial.parseInt(); // 在串口数据流中查找一个有效整数。
if (Serial.available() != "#")
{
Serial.println(p); //打印接收到的数字
}
m = int(0.8*(p-120));
myservo.write(0.8*(p-120));
}
p = 0;
// while (mySerial.available() > 0)
// {
// p = Serial.parseInt();
// Serial.println(p);
// myservo.write(p);
// delay(10);
// }
}
2.openmv部分(寻找红色色块并发送坐标)
# 颜色阈值示例
import sensor, image, time
from pyb import UART
from pyb import LED
# 初始化摄像头和串口
sensor.reset()
sensor.set_framesize(sensor.QQVGA)
sensor.set_pixformat(sensor.RGB565)
#sensor.rotate(180)
uart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1)
# 设置颜色阈值 (minL, maxL, minA, maxA, minB, maxB)
red_threshold = (39, 55, 9, 60, 1, 22) # L A B
sensor.skip_frames(time=2000) # 等待摄像头稳定
clock = time.clock()
red_led = LED(1)
green_led = LED(2)
blue_led = LED(3)
ir_led = LED(4)
while True:
clock.tick()
img = sensor.snapshot()#.rotate(angle(180)) # 拍摄一张图像
img = img.rotation_corr(180)
# 查找矩形并发送矩形中心点的 x 坐标到串口
for r in img.find_rects(threshold=20000):
blobs = img.find_blobs([red_threshold], pixels_threshold=200, area_threshold=200, merge=True)
if blobs:
for b in blobs:
img.draw_rectangle(b.rect())
img.draw_cross(b.cx(), b.cy())
uart.write("#")
uart.write(str(b.cx())) # 将矩形中心点的 x 坐标发送到串口
print(b.cx()) # 打印中心点 x 坐标到控制台 # 将 x 坐标转换为字符串并发送到串口
# 若要查找圆形并发送圆心 x 坐标到串口,取消以下代码的注释
# for c in img.find_circles(threshold=3500, x_margin=10, y_margin=10, r_margin=10,
# r_min=2, r_max=100, r_step=2):
# img.draw_cross(c.x(), c.y()) # 绘制圆心标记
# print(c.x(), c.y()) # 打印圆形检测结果的 x 坐标
# x = c.x()
# uart.write("#")
# uart.write("#")
# uart.write("#")
# uart.write(str(x)) # 将 x 坐标转换为字符串并发送到串口