使用Python和OpenMV讀取條形碼

七月線上實驗室發表於2018-04-03

在今天的文章中,將會介紹OpenMV,以及他們的高階IDE,甚至會教你如何建立自己的條形碼掃描系統。

使用Python和OpenMV讀取條形碼

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

圖1:OpenMV可以在許多型別的程式碼中讀取二維碼


條形碼是計算機將一個專案與資料庫關聯起來的一種簡單方法。因此,必須正確解碼條形碼,以便更新資料庫。


典型的條形碼閱讀器使用光電池來“檢視”程式碼。如果想了解更多可以看看Chris Woodford的文章:條形碼和條形碼掃描器( http://www.explainthatstuff.com/barcodescanners.html )


考慮到當今時代相機的重要性,我們可以使用影象處理來檢測和解碼條形碼。


在PyImageSearch上的一篇文章中,演示瞭如何用Python和OpenCV檢測條形碼。( https://www.pyimagesearch.com/2014/11/24/detecting-barcodes-images-python-opencv/ )


檢測是一個難題,另一件是將條形碼解碼成有用的字串。不幸的是,OpenCV不包含內建的條形碼檢測+閱讀功能…


但有一些流行的庫條形碼檢測,其中一個是ZBar。使用ZBar和其他類似的條形碼閱讀庫是完成任務的一種方法。另一種選擇是使用嵌入式工具和庫,比如OpenMV


事實上,OpenMV使得檢測和閱讀條形碼變得非常容易:

  • 構建自己的條形碼掃描裝置。

  • 在裝配線上建立自動化零件檢驗系統。

  • 利用OpenMV在一個感興趣專案中幫助你掃描和組織車間的元件和外部裝置。

  • 使用OpenMV教中學或高中生關於嵌入式程式設計的知識。

用OpenMV和Python進行條形碼檢測和解碼

安裝OpenMV IDE後啟動它。我們將在OpenMV IDE中完成所有的編碼工作。

讓我們首先建立一個名為openmv_barcode.py 的檔案。

640?wx_fmt=png

在第2-4行,我們匯入所需的MicroPython/OpenMV包。

如果你想使用LCD shield,可以在第9行匯入需要的lcd包。

接下來,讓我們設定攝像機感測器:

640?wx_fmt=png

第12-29行的設定不需要解釋,請閱讀程式碼和註釋。

我想指出的是, LCD需要一個符合螢幕的解析度。(sensor.QQVGA2 )。


注意:我試著弄清楚如何使用全解析度,然後製作一個適合於LCD的縮放影象,但是沒有成功。正因為如此,如果你選擇使用LCD,你就要嘗試解碼低解析度的條形碼。LCD仍然是一個很好的除錯工具,我想把它包括進去,這樣你就可以很容易的使用它。


我還想指出第27行。在“hello world”示例中,你將看到sensor.skip_frames的一個關鍵字引數time=2000。在此上下文中不支援關鍵字引數,所以一定要使用第27行所示的語法(尤其是通過“hello world”執行時)。


接下來,讓我們來執行初始化:

640?wx_fmt=png

如果你使用的是LCD,需要取消第33行

第36行初始化了FPS計算的計時器。


從這裡我們將建立(1)查詢表和(2)確定條形碼型別的方便(convenience function)函式:

640?wx_fmt=png

正如在第39行中看到的,在這裡我定義了一個barcode_type字典,OpenMV可以檢測和解碼很多不同的條形碼樣式。


第57-63行定義了獲取條形碼型別的方便函式,而不會引起Python金鑰異常(OpenMV不能很好地處理異常)。


我們將從開始一個while迴圈開始獲取和處理幀:

640?wx_fmt=png

第一步是為FPS計數器計時(第68行)。


第71行獲取sensor.snapshot框架。


我們有一個影象,讓我們看看能做些什麼

640?wx_fmt=png

我們在這裡找到標準的非QR碼。我們所需要做的就是呼叫img.find_barcodes (封裝了所有條形碼檢測+讀取功能)並迴圈顯示結果(第74行)。


鑑於檢測到的條形碼,我們可以:

  • 圍繞檢測到的條形碼繪製邊框矩形(第76行)。

  • 輸出型別,質量和有效載荷(第79-82行)。

  • 在螢幕上繪製字串(第85行)。根據文件目前沒有辦法用較大的字型繪製字串。


文件地址:http://docs.openmv.io/library/omv.image.html?highlight=draw_string#image.image.draw_string


QR碼解碼以類似的方式完成:

640?wx_fmt=png

此迴圈模仿標準條形碼迴圈,因此請務必檢視詳細資訊。


在迴圈之外,如果使用LCD,你需要在其上進行顯示(第100行)。


最後,在第103行,我們可以在終端上輕鬆輸出FPS(每秒幀數)。

OpenMV條形碼解碼結果

640?wx_fmt=jpeg

圖3:OpenMV團隊為計算機視覺開發設計了一個很棒的IDE。這是在第一次開啟IDE並載入程式時所看到的。


首先,通過USB將OpenMV攝像頭連線到電腦。

然後啟動IDE,如圖3所示。

從那裡,點選左下角的連線按鈕。

IDE可能會提示更新韌體(通過點選按鈕並等待大約3-5分鐘)。


當你準備好在編輯器中載入程式時,請點選左下方的綠色播放/程式按鈕。這個按鈕將用你的程式碼設定OpenMV。


MicroPython程式碼需要大約45-90秒才能編譯成機器程式碼並在處理器上快閃記憶體。

不久之後,如果輸出到終端上,你將看到諸如FPS或條形碼資訊等資料 – 這是正常工作所需要的。你還會在右上方的取景器中看到來自相機感測器的實時檢視。


現在我們來試一下條形碼吧!


以下是我們正在處理的內容:

640?wx_fmt=jpeg

圖4:使用OpenMV攝像機測試樣例條形碼。包括QR, CODE128, CODE93, CODE39和DATABAR條形碼影象。


可以從IDE的內建終端中檢視結果:

640?wx_fmt=png

每段程式碼和終端的截圖如下:

640?wx_fmt=jpeg

圖5:通過連結到PyImageSearch主頁掃描QR碼。

640?wx_fmt=jpeg

圖6:掃描包含“https://openmv.io”有效載荷的QR碼 – OpenMV主頁。

640?wx_fmt=jpeg

圖7:這個二維碼包含了一個有效載荷,可以引導你使用Python圖書資訊頁面進行計算機視覺的深度學習。

640?wx_fmt=jpeg

圖8:一個代號為“guru”的CODE128條形碼由OpenMV解碼。

640?wx_fmt=jpeg

圖9:OpenMV可以解碼CODE93條形碼,例如具有“OpenMV”有效載荷的條形碼。

640?wx_fmt=jpeg

圖10:CODE39條形碼很容易被OpenMV解碼。這裡的有效載荷是“DL4CV”。

640?wx_fmt=jpeg

圖11:OpenMV可以解碼固定寬度且只包含數字的DATABAR程式碼。我在此條形碼中編碼了“2018”,但正如你所看到的,OpenMV相機實際上可以讀取16個字元。


最後是IDE的實際情況。 注意它如何讀取多個程式碼,在條形碼周圍繪製邊框,幷包含顏色直方圖的。

640?wx_fmt=jpeg

圖12:OpenMV正在檢測條形碼並將結果列印到IDE。正如你所看到的,左下方有一個滾動資料的終端。IDE的右上角還有一個實時檢視攝像頭視訊,右下角是顏色直方圖。



IDE非常適合除錯。但是,對於可部署專案,你不應該使用IDE。你可以通過I2C,SPI或WiFi將條形碼有效載荷傳送給執行器,以便在資料庫中進行處理。


這裡是LCD的實際操作:

640?wx_fmt=png

圖13:OpenMV彩色LCD遮蔽為OpenMV提供了一個很好的取景器。

總結

在這篇文章中,我們使用OpenMV來執行條形碼解碼。


旨在成為“機器視覺的開源硬體”,OpenMV cam是嵌入式的(無作業系統),並可通過多種可用 shields進行擴充套件。它也非常易於使用。你可以使用MicroPython在OpenMV上編寫程式碼。


但是,瞭解OpenMV不執行OpenCV很重要,處理器根本無法處理它。 也就是說,內建了許多類似於OpenCV的功能。使用OpenMV IDE,你可以將自己的計算機視覺應用程式組合在一起。

640?wx_fmt=gif

在本公眾號「七月線上實驗室」回覆以下關鍵詞獲取AI乾貨

PPT--《1天搞懂深度學習》資料

小抄--機器學習常用庫小抄表

題庫-- 人工智慧面試題庫

資料集--人工智慧各行業資料彙總

思維導圖--Python學習必備思維導圖電子版

量化交易--量化投資程式設計課程與資料

640?wx_fmt=png

相關文章