【MaixPY 教程】用mixly玩转k210——条形码、二维码、AprilTag识别
【MaixPY 教程】用mixly玩轉(zhuǎn)k210——條形碼、二維碼、AprilTag識(shí)別
【MaixPy系列教程:】
- 【MaixPy教程】用maixHub訓(xùn)練模型進(jìn)行開(kāi)源硬件識(shí)別
- 【MaixPy 教程】用mixly玩轉(zhuǎn)K210——口罩識(shí)別
- 【MaixPy教程】用mixly玩轉(zhuǎn)K210——調(diào)用AI_OneNET API實(shí)現(xiàn)車(chē)牌識(shí)別
- 【MaixPy 教程】用mixly玩轉(zhuǎn)K210——人臉追蹤
- 【MaixPy 教程】用mixly玩轉(zhuǎn)K210——20類(lèi)對(duì)象檢測(cè)
- 【MaixPy 教程】用mixly玩轉(zhuǎn)K210——一鍵本地模型訓(xùn)練
- 【MaixPY 教程】用mixly玩轉(zhuǎn)k210——MixNo通過(guò)TCP/IP與掌控板進(jìn)行通訊
- 【MaixPY 教程】用mixly玩轉(zhuǎn)k210——條形碼、二維碼、AprilTag識(shí)別
前言
隨著科技的發(fā)展,移動(dòng)支付讓人們的生活變得越來(lái)越便捷,可是與之背后的原理我們又了解多少呢?那么今天就讓我?guī)ьI(lǐng)大家一起用milxy一起去實(shí)現(xiàn):條形碼、二維碼、AprilTag識(shí)別。
準(zhǔn)備階段
- Maixduino
- typec 數(shù)據(jù)線(xiàn)
- 條形碼、二維碼、Apriltag碼若干
條形碼
1:什么是條形碼
條形碼(barcode)是將寬度不等的多個(gè)黑條和空白,按照一定的編碼規(guī)則排列,用以表達(dá)一組信息的圖形標(biāo)識(shí)符。常見(jiàn)的條形碼是由反射率相差很大的黑條(簡(jiǎn)稱(chēng)條)和白條(簡(jiǎn)稱(chēng)空)排成的平行線(xiàn)圖案。條形碼可以標(biāo)出物品的生產(chǎn)國(guó)、制造廠(chǎng)家、商品名稱(chēng)、生產(chǎn)日期、圖書(shū)分類(lèi)號(hào)、郵件起止地點(diǎn)、類(lèi)別、日期等許多信息,因而在商品流通、圖書(shū)管理、郵政管理、銀行系統(tǒng)等許多領(lǐng)域都得到廣泛的應(yīng)用
2:條形碼識(shí)別原理
條碼符號(hào)是由反射率不同的“條”、“空”按照一定的編碼規(guī)則組合起來(lái)的一種信息符號(hào)。由于條碼符號(hào)中“條”、“空”對(duì)光線(xiàn)具有不同的反射率,從而使條碼掃描器接受到強(qiáng)弱不同的反射光信號(hào),相應(yīng)地產(chǎn)生電位高低不同的電脈沖。而條碼符號(hào)中“條”、“空”的寬度則決定電位高低不同的電脈沖信號(hào)的長(zhǎng)短。掃描器接收到的光信號(hào)需要經(jīng)光電轉(zhuǎn)換成電信號(hào)并通過(guò)放大電路進(jìn)行放大。由于掃描光點(diǎn)具有一定的尺寸、條碼印刷時(shí)的邊緣模糊性以及一些其他原因,經(jīng)過(guò)電路放大的條碼電信號(hào)是一種平滑的起伏信號(hào),這種信號(hào)被稱(chēng)為“模擬電信號(hào)”?!澳M電信號(hào)”需經(jīng)整形變成通常的“數(shù)字信號(hào)”。根據(jù)碼制所對(duì)應(yīng)的編碼規(guī)則,譯碼器便可將“數(shù)字信號(hào)”識(shí)讀譯成數(shù)字、字符信息
3:BarCode類(lèi)
MaixPy固件中的內(nèi)置庫(kù)image庫(kù)內(nèi)置了BarCode類(lèi),專(zhuān)門(mén)用于識(shí)別條形碼。其中他的方法有:
| barcode.corners() | 返回一個(gè)由該對(duì)象的四個(gè)角組成的四個(gè)元組(x,y)的列表。四個(gè)角通常是按照從左上角開(kāi)始沿順時(shí)針順序返回的。 |
| barcode.rect() | 返回一個(gè)矩形元組(x, y, w, h),用于如數(shù)據(jù)矩陣的邊界框的 image.draw_rectangle 等其他的 image 方法。 |
| barcode.x() | 返回條形碼的邊界框的x坐標(biāo)(int) |
| barcode.y() | 返回條形碼的邊界框的y坐標(biāo)(int)。 |
| barcode.w() | 返回條形碼的邊界框的w寬度(int) |
| barcode.h() | 返回條形碼的邊界框的h高度(int)。 |
| barcode.payload() | 返回條形碼的有效載荷的字符串。例:數(shù)量。 |
| barcode.type() | 返回條形碼的列舉類(lèi)型 (int) |
| barcode.rotation() | 返回以弧度計(jì)的條形碼的旋度(浮點(diǎn)數(shù)) |
| barcode.quality() | 返回條形碼在圖像中被檢測(cè)到的次數(shù)(int) |
mixly中也有相應(yīng)的條形碼識(shí)別積木塊在機(jī)器視覺(jué)中維碼識(shí)別中如下圖所示:
示例程序
import sensor import machine import imagesensor.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)實(shí)驗(yàn)結(jié)果:
二維碼
1:什么是二維碼
二維碼又稱(chēng)二維條碼,常見(jiàn)的二維碼為QR Code,QR全稱(chēng)Quick Response,是一個(gè)近幾年來(lái)移動(dòng)設(shè)備上超流行的一種編碼方式,它比傳統(tǒng)的Bar Code條形碼能存更多的信息,也能表示更多的數(shù)據(jù)類(lèi)型。
2:二維碼的分類(lèi)
二維碼,從字面上看就是用兩個(gè)維度(水平方向和垂直方向)來(lái)進(jìn)行數(shù)據(jù)的編碼,條形碼只利用了一個(gè)維度(水平方向)表示信息,在另一個(gè)維度(垂直方向)沒(méi)有意義,所以二維碼比條形碼有著更高的數(shù)據(jù)存儲(chǔ)容量。
從形成方式上,二維碼可以分為兩類(lèi),
1、堆疊式二維碼:在一維條形碼的基礎(chǔ)上,將多個(gè)條形碼堆積在一起進(jìn)行編碼,常見(jiàn)的編碼標(biāo)準(zhǔn)有PDF417等
2、矩陣式二維碼:在一個(gè)矩陣空間中通過(guò)黑色和白色的方塊進(jìn)行信息的表示,黑色的方塊表示1,白色的方塊表示0,相應(yīng)的組合表示了一系列的信息,常見(jiàn)的編碼標(biāo)準(zhǔn)有QR 碼,漢信碼等
3:二維碼的結(jié)構(gòu)
一個(gè)二維碼可以分為兩個(gè)部分,功能圖形和編碼區(qū)域
功能圖形起到定位的作用
| 位置探測(cè)圖形 | 由三個(gè)黑白相間的大正方形嵌套組成,分別位于二維碼左上角、右上角、左下角,目的是為了確定二維碼的大小和位置。 |
| 定位圖形 | 由兩條黑白相間的直線(xiàn)組成,便于確定二維碼的角度,糾正扭曲。 |
| 校正圖形 | 僅在版本2以上存在,由三個(gè)黑白相間的小正方形嵌套組成,便于確定中心,糾正扭曲。 |
數(shù)據(jù)區(qū)記錄了具體的數(shù)據(jù)信息,糾錯(cuò)信息與版本信息
| 數(shù)據(jù)和糾錯(cuò)碼 | 記錄了數(shù)據(jù)信息和相應(yīng)的糾錯(cuò)碼,糾錯(cuò)碼的存在使得當(dāng)二維碼的數(shù)據(jù)出現(xiàn)允許范圍內(nèi)的錯(cuò)誤時(shí),也可以正確解碼。 |
| 版本信息 | 僅在版本7以上存在,記錄具體的版本信息。 |
| 格式信息 | 記錄使用的掩碼和糾錯(cuò)等級(jí)。 |
此外二維碼的外圍還留有一圈空白區(qū),主要是為了便于識(shí)別而存在。
4:QRCode類(lèi)
MaixPy固件中的內(nèi)置庫(kù)image庫(kù)內(nèi)置了QRCode類(lèi),專(zhuān)門(mén)用于識(shí)別二位碼。其中它的方法有:
| qrcode.corners() | 返回一個(gè)由該對(duì)象的四個(gè)角組成的四個(gè)元組(x,y)的列表。四個(gè)角通常是按照從左上角開(kāi)始沿順時(shí)針順序返回的。 |
| qrcode.rect() | 返回一個(gè)矩形元組(x, y, w, h),用于如二維碼的邊界框的 image.draw_rectangle 等其他的 image 方法。 |
| qrcode.x() | 返回二維碼的邊界框的x坐標(biāo)(int) |
| qrcode.y() | 返回二維碼的邊界框的y坐標(biāo)(int)。 |
| qrcode.w() | 返回二維碼的邊界框的w坐標(biāo)(int)。 |
| qrcode.h() | 返回二維碼的邊界框的h坐標(biāo)(int)。 |
| qrcode.payload() | 返回二維碼有效載荷的字符串,例如URL 。 |
| qrcode.version() | 返回二維碼的版本號(hào)(int)。 |
| qrcode.ecc_level() | 返回二維碼的ECC水平(int)。 |
| qrcode.data_type() | 返回二維碼的數(shù)據(jù)類(lèi)型。 |
| qrcode.eci() | 返回二維碼的ECI。ECI儲(chǔ)存了QR碼中存儲(chǔ)數(shù)據(jù)字節(jié)的編碼。若您想要處理包含超過(guò)標(biāo)準(zhǔn)ASCII文本的二維碼,您需要查看這一數(shù)值。 |
| qrcode.is_numeric() | 若二維碼的數(shù)據(jù)類(lèi)型為數(shù)字式,則返回True |
| qrcode.is_alphanumeric() | 若二維碼的數(shù)據(jù)類(lèi)型為文字?jǐn)?shù)字式,則返回True。 |
| qrcode.is_binary() | 若二維碼的數(shù)據(jù)類(lèi)型為二進(jìn)制式,則返回True |
| qrcode.is_kanji() | 若二維碼的數(shù)據(jù)類(lèi)型為日本漢字,則返回True |
mixly中也有相應(yīng)的條形碼識(shí)別積木塊在機(jī)器視覺(jué)中維碼識(shí)別中如下圖所示:
示例程序
程序代碼
實(shí)驗(yàn)結(jié)果:
可以用草料二維碼生成器在線(xiàn)生成我們想要的內(nèi)容。
AprilTag
1:什么是AprilTag?
AprilTags是基準(zhǔn)標(biāo)記的一種流行形式。它在機(jī)器人技術(shù)中具有廣泛的應(yīng)用,包括對(duì)象跟蹤,視覺(jué)定位,SLAM準(zhǔn)確性評(píng)估和人機(jī)交互。Isaac通過(guò)利用GPU加速同時(shí)實(shí)現(xiàn)高解碼魯棒性來(lái)提供實(shí)時(shí)AprilTag檢測(cè)。
2:和條形碼二維碼的區(qū)別
AprilTag標(biāo)記在機(jī)器視覺(jué)中顯得比條形碼、二維碼更加有用,因?yàn)樗軌蛲ㄟ^(guò)AprilTag檢測(cè)程序可以計(jì)算相對(duì)于相機(jī)的精確3D位置,方向和id;真實(shí)世界中的3D位置對(duì)于機(jī)器來(lái)說(shuō)非常有用!AprilTag常用于各種任務(wù),包括AR,機(jī)器人和相機(jī)校準(zhǔn)。
3:Apriltag生成
MaixPy IDE 中在工具-》機(jī)器視覺(jué)選擇中有不同碼的生成如下圖
如果用的老師用二哈覺(jué)得官方給的標(biāo)簽可以用這個(gè)生成哦。
4:AprilTag類(lèi)
| apriltag.corners() | 返回一個(gè)由該對(duì)象的四個(gè)角組成的四個(gè)元組(x,y)的列表。 |
| apriltag.rect() | 返回一個(gè)矩形元組(x, y, w, h),用于如AprilTag邊界框的 image.draw_rectangle 等其他的 image 方法 |
| apriltag.x() | 返回AprilTag邊界框的x坐標(biāo)(int)。 |
| apriltag.y() | 返回AprilTag邊界框的y坐標(biāo)(int)。 |
| apriltag.w() | 返回AprilTag邊界框的w坐標(biāo)(int)。 |
| apriltag.h() | 返回AprilTag邊界框的h坐標(biāo)(int)。 |
| apriltag.id() | 返回AprilTag的數(shù)字ID。 |
| apriltag.family() | 返回AprilTag的數(shù)字家庭。 |
| apriltag.cx() | 返回AprilTag的中心x位置(int)。 |
| apriltag.cy() | 返回AprilTag的中心y位置(int)。 |
| apriltag.rotation() | 返回以弧度計(jì)的AprilTag的旋度(int)。 |
| apriltag.decision_margin() | 返回AprilTag匹配的色飽和度(取值0.0 - 1.0),其中1.0為最佳。 |
| apriltag.hamming() | 返回AprilTag的可接受的數(shù)位誤差數(shù)值。 |
| apriltag.goodness() | 返回AprilTag圖像的色飽和度(取值0.0 - 1.0),其中1.0為最佳。 |
| apriltag.x_translation() | 返回距離攝像機(jī)x方向的變換,距離的單位未知。 |
| apriltag.y_translation() | 返回距離攝像機(jī)y方向的變換,距離的單位未知。 |
| apriltag.z_translation() | 返回距離攝像機(jī)z方向的變換,距離的單位未知。 |
| apriltag.x_rotation() | 返回以弧度計(jì)的AprilTag在X平面上的旋度。例:目視AprilTag,從左至右移動(dòng)攝像頭。 |
| apriltag.y_rotation() | 返回以弧度計(jì)的AprilTag在Y平面上的旋度。例:目視AprilTag,從上至下移動(dòng)攝像頭。 |
| apriltag.z_rotation() | 返回以弧度計(jì)的AprilTag在Z平面上的旋度。例:目視AprilTag,旋轉(zhuǎn)攝像頭。 |
mixly中也有相應(yīng)的AprilTag識(shí)別積木塊在機(jī)器視覺(jué)中維碼識(shí)別中如下圖所示:
示例程序
考慮到識(shí)別性能問(wèn)題,我們應(yīng)該設(shè)計(jì)攝像頭的幀大小為:160120,同樣ArilTag識(shí)別圖像區(qū)域同樣為:0,0,160,120*
程序代碼
實(shí)驗(yàn)結(jié)果:
總結(jié)
通過(guò)本次的教程,想必大家都對(duì)標(biāo)簽識(shí)別都有了一定的了解了吧,應(yīng)用功能請(qǐng)參考下一篇:標(biāo)簽識(shí)別音樂(lè)播放器。敬請(qǐng)期待!!更多教程歡迎訪(fǎng)問(wèn)個(gè)人博客:www.hockel.club 有問(wèn)題的可以加入【MixNo QQ群:1056344043】
總結(jié)
以上是生活随笔為你收集整理的【MaixPY 教程】用mixly玩转k210——条形码、二维码、AprilTag识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: html 隐藏广告代码,js漂浮广告原理
- 下一篇: [DA45] 信用卡诈骗分析