任务目标:使用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')
|