1.A码识别追踪小车
openmv代码:
使用HEX数据帧格式
import sensor
import image
import time
import struct
from pyb import UART
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA) #QQVGA
sensor.skip_frames(30)
sensor.set_auto_gain(False) # 关闭
sensor.set_auto_whitebal(False) # 关闭白平衡
clock = time.clock()
uart = UART (3, 9600) #初始化串口3,波特率为9600(注意:下位机stm32记得也配置成9600)
uart.init(9600, bits=8, parity=None, stop=1) #设置波特率为9600,数据位8位,无校验位,停止位1位
# f_x 是x的像素为单位的焦距。对于标准的OpenMV,应该等于2.8/3.984*656,这个值是用毫米为单位的焦距除以x方向的感光元件的长度,乘以x方向的感光元件的像素(OV7725)
# f_y 是y的像素为单位的焦距。对于标准的OpenMV,应该等于2.8/2.952*488,这个值是用毫米为单位的焦距除以y方向的感光元件的长度,乘以y方向的感光元件的像素(OV7725)
# c_x 是图像的x中心位置
# c_y 是图像的y中心位置
f_x = (2.8 / 3.984) * 160 # 默认值
f_y = (2.8 / 2.952) * 120 # 默认值
c_x = 160 * 0.5 # 默认值(image.w * 0.5)
c_y = 120 * 0.5 # 默认值(image.h * 0.5)
while(True):
clock.tick()
img = sensor.snapshot()
for tag in img.find_apriltags(families=image.TAG36H11,fx=f_x, fy=f_y, cx=c_x, cy=c_y): # TAG36H11
img.draw_rectangle(tag.rect(), color = (255, 0, 0))
img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0))
#打印数组print_args
print_args = ( tag.x_translation(), tag.z_translation())
print("Tag Family %s, Tag ID %d, Tx: %f, Ty %f, Tz %f" % print_args)
#发送数组data
#帧头 + 帧头 + id信息 + x坐标 + z距离 + 标志位 + 帧尾
#使用struct将数据打包并发送,保证float型x坐标数据准确及其信息的完整性
if tag.x_translation() >= 0:
data = struct.pack("<bbiiibb",
0xAA, #帧头
0xAE, #帧头
tag.id(), #数据id
#x的坐标
int(10000*tag.x_translation()),#数据1
#z的坐标
-int(10000*tag.z_translation()),#数据2
0xBF, #标志位表示大于零
0xAC) #帧尾
else:
data = struct.pack("<bbiiibb",
0xAA, #帧头
0xAE, #帧头
tag.id(), #数据id
#x的坐标
-int(1000*tag.x_translation()),#数据1
#z的坐标
-int(10000*tag.z_translation()),#数据2
0xCF, #标志位表示小于零
0xAC) #帧尾
uart.write(data) #com3串口发送
time.sleep_ms(50)
# uart.write("Tag Family %s, Tag ID %d, Tx: %f, Ty %f, Tz %f" % print_args+"\r\n")#与windows通信
print(clock.fps())
关于X_,Y_这些数据的正负:箭头所指是正方向
关于画面上的坐标:
2.巡线小车:
相关函数:
image.find_blobs
(thresholds, invert=False, roi, x_stride, y_stride, area_threshold, pixels_threshold, merge=False, margin, threshold_cb, merge_cb, x_hist_bins_max, y_hist_bins_max)
作用:查找图像中所有色块,并返回一个包括每个色块的色块对象的列表
1.thresholds 必须是元组列表。
对于灰度图像,每个元组需要包含两个值 - 最小灰度值和最大灰度值(lo, hi)。
对于RGB565图像,每个元组需要有六个值(l_lo,l_hi,a_lo,a_hi,b_lo,b_hi)分别是L,A、B通道的最
小值和最大值。
thresholds可为多元组遍历多个想要追踪的颜色: [(lo, hi), (lo, hi), ..., (lo, hi)]
2.merge 若为True,则合并所有没有被过滤掉的色块,这些色块的边界矩形互相交错重叠。
margin 可在相交测试中用来增大或减小色块边界矩形的大小。例如:边缘为1、相互间边界矩形为1的色块将被合并。
3.threshold_cb 用以调用阈值筛选后每个色块的函数,以便将其从将要合并的色块列表中过滤出来。 回调函数将收到一个参数:要被筛选的色块对象。然后回调函数需返回True以保留色块或返回False以过滤色块。
merge_cb 可设置为用以调用两个即将合并的色块的函数,以禁止或准许合并。回调函数将收到两个参数—两个将被合并的色块对象。 回调函数须返回True以合并色块,或返回False以防止色块合并。
x_hist_bins_max 如果设置为非零值,则使用对象中所有列的 x_histogram 投影填充每个 blob 对象中的直方图缓冲区。 然后该值设置该投影的箱数。
y_hist_bins_max 如果设置为非零,则使用对象中所有行的 y_histogram 投影填充每个 blob 对象中的直方图缓冲区。 然后该值设置该投影的箱数。
image.get_regression
(thresholds, invert, roi, x_stride, y_stride, area_threshold, pixels_threshold, robust)
1.thresholds,所要追踪颜色的阈值
2.invert 反转阈值操作,像素在已知颜色范围之外进行匹配
3.roi 是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形
4. x_stride 是调用函数时要跳过的x像素数。
y_stride 是调用函数时要跳过的y像素数。
5.如果回归后的边界框区域小于 area_threshold ,则返回None。
如果回归后的像素数小于 pixel_threshold ,则返回None。
6.robust=ture,即开启sen线性回归算法,对图像中所有阈值像素进行线性回归,本质是计算图像中所有阈值像素的斜率中位数
Line对象:
def Line:
{
line.line():
{
return //返回x1,y1,x2,y2
}
line.x1/y1/x2/y2()
{
return //返回x1,y1,x2,y2任意一个
}
line.magnitude()
{
return 返回霍夫变换后直线的模
}
line.theta()
{
return 返回直线的角度
}
line.rho()
{
return 返回直线的p值,代表偏移的距离
}
}