OPENMV

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值,代表偏移的距离
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值