【MaixPY 教程】用mixly玩轉k210——條形碼、二維碼、AprilTag識別
【MaixPy系列教程:】
- 【MaixPy教程】用maixHub訓練模型進行開源硬件識別
- 【MaixPy 教程】用mixly玩轉K210——口罩識別
- 【MaixPy教程】用mixly玩轉K210——調用AI_OneNET API實現車牌識別
- 【MaixPy 教程】用mixly玩轉K210——人臉追蹤
- 【MaixPy 教程】用mixly玩轉K210——20類對象檢測
- 【MaixPy 教程】用mixly玩轉K210——一鍵本地模型訓練
- 【MaixPY 教程】用mixly玩轉k210——MixNo通過TCP/IP與掌控板進行通訊
- 【MaixPY 教程】用mixly玩轉k210——條形碼、二維碼、AprilTag識別
前言
隨着科技的發展,移動支付讓人們的生活變得越來越便捷,可是與之背後的原理我們又瞭解多少呢?那麼今天就讓我帶領大家一起用milxy一起去實現:條形碼、二維碼、AprilTag識別。
準備階段
- Maixduino
- typec 數據線
- 條形碼、二維碼、Apriltag碼若干
條形碼
1:什麼是條形碼
條形碼(barcode)是將寬度不等的多個黑條和空白,按照一定的編碼規則排列,用以表達一組信息的圖形標識符。常見的條形碼是由反射率相差很大的黑條(簡稱條)和白條(簡稱空)排成的平行線圖案。條形碼可以標出物品的生產國、製造廠家、商品名稱、生產日期、圖書分類號、郵件起止地點、類別、日期等許多信息,因而在商品流通、圖書管理、郵政管理、銀行系統等許多領域都得到廣泛的應用
2:條形碼識別原理
條碼符號是由反射率不同的“條”、“空”按照一定的編碼規則組合起來的一種信息符號。由於條碼符號中“條”、“空”對光線具有不同的反射率,從而使條碼掃描器接受到強弱不同的反射光信號,相應地產生電位高低不同的電脈衝。而條碼符號中“條”、“空”的寬度則決定電位高低不同的電脈衝信號的長短。掃描器接收到的光信號需要經光電轉換成電信號並通過放大電路進行放大。由於掃描光點具有一定的尺寸、條碼印刷時的邊緣模糊性以及一些其他原因,經過電路放大的條碼電信號是一種平滑的起伏信號,這種信號被稱爲“模擬電信號”。“模擬電信號”需經整形變成通常的“數字信號”。根據碼制所對應的編碼規則,譯碼器便可將“數字信號”識讀譯成數字、字符信息
3:BarCode類
MaixPy固件中的內置庫image庫內置了BarCode類,專門用於識別條形碼。其中他的方法有:
方法名稱 | 功能 |
---|---|
barcode.corners() | 返回一個由該對象的四個角組成的四個元組(x,y)的列表。四個角通常是按照從左上角開始沿順時針順序返回的。 |
barcode.rect() | 返回一個矩形元組(x, y, w, h),用於如數據矩陣的邊界框的 image.draw_rectangle 等其他的 image 方法。 |
barcode.x() | 返回條形碼的邊界框的x座標(int) |
barcode.y() | 返回條形碼的邊界框的y座標(int)。 |
barcode.w() | 返回條形碼的邊界框的w寬度(int) |
barcode.h() | 返回條形碼的邊界框的h高度(int)。 |
barcode.payload() | 返回條形碼的有效載荷的字符串。例:數量。 |
barcode.type() | 返回條形碼的列舉類型 (int) |
barcode.rotation() | 返回以弧度計的條形碼的旋度(浮點數) |
barcode.quality() | 返回條形碼在圖像中被檢測到的次數(int) |
mixly中也有相應的條形碼識別積木塊在機器視覺中維碼識別中如下圖所示:
示例程序
import sensor
import machine
import image
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
sensor.skip_frames(10)
while True:
img = sensor.snapshot()
code = img.find_barcodes([0,0,320,240])
for i in code:
code_text = i.payload()
print(code_text)
實驗結果:
二維碼
1:什麼是二維碼
二維碼又稱二維條碼,常見的二維碼爲QR Code,QR全稱Quick Response,是一個近幾年來移動設備上超流行的一種編碼方式,它比傳統的Bar Code條形碼能存更多的信息,也能表示更多的數據類型。
2:二維碼的分類
二維碼,從字面上看就是用兩個維度(水平方向和垂直方向)來進行數據的編碼,條形碼只利用了一個維度(水平方向)表示信息,在另一個維度(垂直方向)沒有意義,所以二維碼比條形碼有着更高的數據存儲容量。
從形成方式上,二維碼可以分爲兩類,
1、堆疊式二維碼:在一維條形碼的基礎上,將多個條形碼堆積在一起進行編碼,常見的編碼標準有PDF417等
2、矩陣式二維碼:在一個矩陣空間中通過黑色和白色的方塊進行信息的表示,黑色的方塊表示1,白色的方塊表示0,相應的組合表示了一系列的信息,常見的編碼標準有QR 碼,漢信碼等
PDF417由美國研發,在美國地區使用廣泛
漢信碼由中國自主研發,目前已在政府相關領域得到初步的使用。
QR碼由日本研發,目前很多的應用都是用QR碼進行編碼,譯碼(目前使用最廣的是QR碼,所以接下來的內容會對QR碼進行講解)
3:二維碼的結構
一個二維碼可以分爲兩個部分,功能圖形和編碼區域
功能圖形起到定位的作用
名稱 | 作用 |
---|---|
位置探測圖形 | 由三個黑白相間的大正方形嵌套組成,分別位於二維碼左上角、右上角、左下角,目的是爲了確定二維碼的大小和位置。 |
定位圖形 | 由兩條黑白相間的直線組成,便於確定二維碼的角度,糾正扭曲。 |
校正圖形 | 僅在版本2以上存在,由三個黑白相間的小正方形嵌套組成,便於確定中心,糾正扭曲。 |
數據區記錄了具體的數據信息,糾錯信息與版本信息
名稱 | 作用 |
---|---|
數據和糾錯碼 | 記錄了數據信息和相應的糾錯碼,糾錯碼的存在使得當二維碼的數據出現允許範圍內的錯誤時,也可以正確解碼。 |
版本信息 | 僅在版本7以上存在,記錄具體的版本信息。 |
格式信息 | 記錄使用的掩碼和糾錯等級。 |
此外二維碼的外圍還留有一圈空白區,主要是爲了便於識別而存在。
4:QRCode類
MaixPy固件中的內置庫image庫內置了QRCode類,專門用於識別二位碼。其中它的方法有:
方法名稱 | 作用 |
---|---|
qrcode.corners() | 返回一個由該對象的四個角組成的四個元組(x,y)的列表。四個角通常是按照從左上角開始沿順時針順序返回的。 |
qrcode.rect() | 返回一個矩形元組(x, y, w, h),用於如二維碼的邊界框的 image.draw_rectangle 等其他的 image 方法。 |
qrcode.x() | 返回二維碼的邊界框的x座標(int) |
qrcode.y() | 返回二維碼的邊界框的y座標(int)。 |
qrcode.w() | 返回二維碼的邊界框的w座標(int)。 |
qrcode.h() | 返回二維碼的邊界框的h座標(int)。 |
qrcode.payload() | 返回二維碼有效載荷的字符串,例如URL 。 |
qrcode.version() | 返回二維碼的版本號(int)。 |
qrcode.ecc_level() | 返回二維碼的ECC水平(int)。 |
qrcode.data_type() | 返回二維碼的數據類型。 |
qrcode.eci() | 返回二維碼的ECI。ECI儲存了QR碼中存儲數據字節的編碼。若您想要處理包含超過標準ASCII文本的二維碼,您需要查看這一數值。 |
qrcode.is_numeric() | 若二維碼的數據類型爲數字式,則返回True |
qrcode.is_alphanumeric() | 若二維碼的數據類型爲文字數字式,則返回True。 |
qrcode.is_binary() | 若二維碼的數據類型爲二進制式,則返回True |
qrcode.is_kanji() | 若二維碼的數據類型爲日本漢字,則返回True |
mixly中也有相應的條形碼識別積木塊在機器視覺中維碼識別中如下圖所示:
示例程序
程序代碼
import sensor
import machine
import image
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
sensor.skip_frames(10)
sensor.set_hmirror(0)
while True:
img = sensor.snapshot()
code = img.find_qrcodes([0,0,320,240])
for i in code:
code_text = i.payload()
print(code_text)
實驗結果:
可以用草料二維碼生成器在線生成我們想要的內容。
AprilTag
1:什麼是AprilTag?
AprilTags是基準標記的一種流行形式。它在機器人技術中具有廣泛的應用,包括對象跟蹤,視覺定位,SLAM準確性評估和人機交互。Isaac通過利用GPU加速同時實現高解碼魯棒性來提供實時AprilTag檢測。
2:和條形碼二維碼的區別
AprilTag標記在機器視覺中顯得比條形碼、二維碼更加有用,因爲它能夠通過AprilTag檢測程序可以計算相對於相機的精確3D位置,方向和id;真實世界中的3D位置對於機器來說非常有用!AprilTag常用於各種任務,包括AR,機器人和相機校準。
3:Apriltag生成
MaixPy IDE 中在工具-》機器視覺選擇中有不同碼的生成如下圖
如果用的老師用二哈覺得官方給的標籤可以用這個生成哦。
4:AprilTag類
方法名稱 | 作用 |
---|---|
apriltag.corners() | 返回一個由該對象的四個角組成的四個元組(x,y)的列表。 |
apriltag.rect() | 返回一個矩形元組(x, y, w, h),用於如AprilTag邊界框的 image.draw_rectangle 等其他的 image 方法 |
apriltag.x() | 返回AprilTag邊界框的x座標(int)。 |
apriltag.y() | 返回AprilTag邊界框的y座標(int)。 |
apriltag.w() | 返回AprilTag邊界框的w座標(int)。 |
apriltag.h() | 返回AprilTag邊界框的h座標(int)。 |
apriltag.id() | 返回AprilTag的數字ID。 |
apriltag.family() | 返回AprilTag的數字家庭。 |
apriltag.cx() | 返回AprilTag的中心x位置(int)。 |
apriltag.cy() | 返回AprilTag的中心y位置(int)。 |
apriltag.rotation() | 返回以弧度計的AprilTag的旋度(int)。 |
apriltag.decision_margin() | 返回AprilTag匹配的色飽和度(取值0.0 - 1.0),其中1.0爲最佳。 |
apriltag.hamming() | 返回AprilTag的可接受的數位誤差數值。 |
apriltag.goodness() | 返回AprilTag圖像的色飽和度(取值0.0 - 1.0),其中1.0爲最佳。 |
apriltag.x_translation() | 返回距離攝像機x方向的變換,距離的單位未知。 |
apriltag.y_translation() | 返回距離攝像機y方向的變換,距離的單位未知。 |
apriltag.z_translation() | 返回距離攝像機z方向的變換,距離的單位未知。 |
apriltag.x_rotation() | 返回以弧度計的AprilTag在X平面上的旋度。例:目視AprilTag,從左至右移動攝像頭。 |
apriltag.y_rotation() | 返回以弧度計的AprilTag在Y平面上的旋度。例:目視AprilTag,從上至下移動攝像頭。 |
apriltag.z_rotation() | 返回以弧度計的AprilTag在Z平面上的旋度。例:目視AprilTag,旋轉攝像頭。 |
mixly中也有相應的AprilTag識別積木塊在機器視覺中維碼識別中如下圖所示:
示例程序
考慮到識別性能問題,我們應該設計攝像頭的幀大小爲:160120,同樣ArilTag識別圖像區域同樣爲:0,0,160,120*
程序代碼
import sensor
import machine
import image
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.run(1)
sensor.skip_frames(10)
sensor.set_hmirror(0)
while True:
img = sensor.snapshot()
code = img.find_apriltags([0,0,160,120])
for i in code:
code_text = i.id()
print(code_text)
實驗結果:
總結
通過本次的教程,想必大家都對標籤識別都有了一定的瞭解了吧,應用功能請參考下一篇:標籤識別音樂播放器。敬請期待!!更多教程歡迎訪問個人博客:www.hockel.club 有問題的可以加入【MixNo QQ羣:1056344043】