星瞳科技OpenMV視頻教程11-AprilTag標記追蹤

星瞳科技OpenMV視頻教程11-AprilTag標記追蹤

來自專欄走在電子的前列線上

視頻第一部分:

https://www.zhihu.com/video/986928406080012288

視頻第二部分:

https://www.zhihu.com/video/986928562082971648

星瞳科技OpenMV官方代理視頻地址:點擊這裡!!

嗶哩嗶哩地址:

星瞳科技OpenMV視頻教程11-AprilTag標記追蹤_野生技術協會_科技_bilibili_嗶哩嗶哩

AprilTag簡介

資料:april.eecs.umich.edu/so

AprilTag是一個視覺基準系統,可用於各種任務,包括AR,機器人和相機校準。這個tag可以直接用印表機列印出來,而AprilTag檢測程序可以計算相對於相機的精確3D位置,方向和id。對於OpenMV來說,這個特別有用! 它大概長這個樣子:

簡單來說,只要把這個tag貼到目標上,就可以在OpenMV上識別出這個標籤的3D位置,id。

AprilTag的種類

AprilTag的種類叫家族(family),有下面的幾種:

TAG16H5 → 0 to 29 TAG25H7 → 0 to 241 TAG25H9 → 0 to 34 TAG36H10 → 0 to 2319 TAG36H11 → 0 to 586 ARTOOLKIT → 0 to 511 也就是說TAG16H5的家族(family)有30個,每一個都有對應的id,從0~29。

那麼不同的家族,有什麼區別呢?

比如說TAG16H5的有效區域是4 x 4的方塊,那麼它比TAG36H11看的更遠(因為他有6 x 6個方塊)。但是TAG16H5的錯誤率比TAG36H11高很多,因為TAG36H11的校驗信息多,所以,如果沒有別的理由,推薦用TAG36H11

製作AprilTag

很簡單,你可以在網路上下載,也可以直接從OpenMV的IDE里生成。 在工具——Machine Vision——AprilTag Generate中選擇family,推薦使用TAG36H11。

然後,填寫需要生成的個數,比如需要10個,就生成id為0~9的圖片。

然後選擇一下圖片存放的文件夾,就可以了。

然後,在該文件夾會生成圖片。

最後,把這個圖片用印表機列印出來(當然,也可以直接用屏幕,但是可能會反光)。

程序

# AprilTags Example## This example shows the power of the OpenMV Cam to detect April Tags# on the OpenMV Cam M7. The M4 versions cannot detect April Tags.import sensor, image, time, mathsensor.reset()sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QQVGA) # we run out of memory if the resolution is much bigger...sensor.skip_frames(30)sensor.set_auto_gain(False) # must turn this off to prevent image washout...sensor.set_auto_whitebal(False) # must turn this off to prevent image washout...clock = time.clock()while(True): clock.tick() img = sensor.snapshot() for tag in img.find_apriltags(): # defaults to TAG36H11 without "families". img.draw_rectangle(tag.rect(), color = (255, 0, 0)) img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0)) degress = 180 * tag.rotation() / math.pi print(tag.id(),degress)

可以看到,可以識別出id為0,旋轉的角度,位置

3D定位

AprilTag最神奇的是3D定位的功能,它可以得知Tag的空間位置,一共有6個自由度,三個位置,三個角度。

# AprilTags Example## This example shows the power of the OpenMV Cam to detect April Tags# on the OpenMV Cam M7. The M4 versions cannot detect April Tags.import sensor, image, time, mathsensor.reset()sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QQVGA) # we run out of memory if the resolution is much bigger...sensor.skip_frames(30)sensor.set_auto_gain(False) # must turn this off to prevent image washout...sensor.set_auto_whitebal(False) # must turn this off to prevent image washout...clock = time.clock()# 注意!與find_qrcodes不同,find_apriltags 不需要軟體矯正畸變就可以工作。# 注意,輸出的姿態的單位是弧度,可以轉換成角度,但是位置的單位是和你的大小有關,需要等比例換算# 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)def degrees(radians): return (180 * radians) / math.piwhile(True): clock.tick() img = sensor.snapshot() for tag in img.find_apriltags(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 = (tag.x_translation(), tag.y_translation(), tag.z_translation(), degrees(tag.x_rotation()), degrees(tag.y_rotation()), degrees(tag.z_rotation())) # 位置的單位是未知的,旋轉的單位是角度 print("Tx: %f, Ty %f, Tz %f, Rx %f, Ry %f, Rz %f" % print_args) print(clock.fps())

在串口輸出為6個變數,Tx, Ty, Tz為空間的3個位置量,Rx,Ry,Rz為三個旋轉量。


推薦閱讀:

國標舞教程-米爾科《舞出音樂》
【引用實例教程】幫老人織毛褲(原創)--新增加編織過程圖片說明
優酷里的成真戀愛學是否真的有用?
自製牆掛:用麻繩DIY漂亮的背景牆裝飾牆挂圖解教程╭★肉丁網
三星派玄空风水阳宅操作教程

TAG:教程 | 視頻教程 |