任务目标:使用openmv检测红色小球 ,找到小球在ROI中的坐标值,通过URAT通讯将 小球的二维平面坐标值发送给STM32单片机。
首先是寻找红色小球的色块
while(True):
clock.tick()
img = sensor.snapshot()
for blob in img.find_blobs([thresholds[threshold_index]], pixels_threshold=200, area_threshold=200, merge=True):
利用img.find_blobs函数
image.
find_blobs
(thresholds[, invert=False[, roi[, x_stride=2[, y_stride=1[, area_threshold=10[, pixels_threshold=10[, merge=False[, margin=0[, threshold_cb=None[, merge_cb=None]]]]]]]]]])
thresholds 是检测对象的颜色阈值
invert
是反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。
roi
是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于 roi
区域内的像素。
x_stride
是查找某色块时需要跳过的x像素的数量。找到色块后,直线填充算法将精确像素。 若已知色块较大,可增加 x_stride
来提高查找色块的速度。
y_stride
是查找某色块时需要跳过的y像素的数量。找到色块后,直线填充算法将精确像素。 若已知色块较大,可增加 y_stride
来提高查找色块的速度。
若一个色块的边界框区域小于 area_threshold
,则会被过滤掉。
若一个色块的像素数小于 pixel_threshold
,则会被过滤掉。
merge
若为True,则合并所有没有被过滤掉的色块,这些色块的边界矩形互相交错重叠。 margin
可在相交测试中用来增大或减小色块边界矩形的大小。例如:边缘为1、相互间边界矩形为1的色块将被合并。
URAT
uart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1) #8位数据位,无校验位,1位停止位、
if blob: #如果找到了目标颜色
uart.write("X,Y\r")#一帧数据的帧头
for b in blob:
#迭代找到的目标颜色区域
img.draw_rectangle(b[0:4]) # rect
img.draw_cross(b[5], b[6]) # cx, cy
x = b.cx()
y = b.cy()
output_str="[%d,%d]" % (x,y) #方式1
#output_str=json.dumps([max_blob.cx(),max_blob.cy()]) #方式2
print('you send:',output_str)
uart.write(output_str+'\r\n')