手把手教你實現pynq-z2條形碼識別

雪天魚發表於2022-02-16

我是 雪天魚,一名FPGA愛好者,研究方向是FPGA架構探索和SOC設計。

file

關注公眾號,拉你進“IC設計交流群”。

1.前言

單單實現一個二維碼識別就花了將近一個星期,這篇文章我就詳細介紹這段時間走過的坑,程式碼附在文末,著急需要的小夥伴直接翻到最後即可

2. linux配置

要想實現本專案,首先解決以下三大要點,也著實浪費了很多時間

2.1解決pynq聯網

pynq聯網的教程網上可謂是不少,但是我卻整了很久。
首先是在家裡,我採用

在這裡插入圖片描述

所示的方法,然後成功ping通外網
在學校時這個方法卻解決不了,我嘗試了網上很多方法都無法解決(可能我太菜了),最終在重新燒錄了幾次映象後發現:直接把網線連到宿舍的路由器上就連上外網了...

在這裡插入圖片描述

具體還有關於修改下載源變為映象源的方法可以參考其他部落格

2.2解決pyzbar庫下載

這個庫下載推薦採用

pip3 install pyzbar

這個庫安裝的路徑也要注意,命令列下輸入

pip3 show pyzbar

我的在這裡:

在這裡插入圖片描述

圖 2.2.1. pyzbar的位置

多說一句,下面的zbar包我採用

sudo apt-get install python-zbar

得到,為什麼不用pip3,因為pip3下載這個總是報錯,即使是

pip3 upgrade

也不行,不是pip3版本的問題。
我的linux映象是v2.3版本的,不知道大家採用v2.5或者更高會不會好些

在這裡插入圖片描述

圖 2.2.2. zbar的位置

2.3解決jupyter匯入庫

2.3.1 首先說明問題的由來

我發現使用

pip3 install pillow

PIL在jupyter下能匯入,但是卻不能匯入pyzbar
又發現在命令列輸入 python3後,可以匯入pyzbar,但不能匯入zbar

在這裡插入圖片描述

圖 2.3.1. python3匯入pyzbar成功,匯入zbar不成功

我在命令列輸入pyhton 直譯器下發現不能匯入pyzbar,但可以匯入zbar
這就引起了我的注意,最終我發現原來pip3來的pyzbar有單獨的儲存路徑,apt-get同理
至於為什麼python和python3不能引入相同的包
那就得

import sys
sys.path

採用語句來觀察,發現引用路徑不一致。我想我知道了癥結所在:

在這裡插入圖片描述

圖 2.3.2. 不太通順的解釋

$\color{#FF3030}{紅字}$不太通順,翻譯成 人話 就是:
jupyter要設定為 支援引用 儲存pyzbar包的路徑

在這裡插入圖片描述

2.3.2 方法一:

修改環境變數

說明,以下為引用:

文章源地址:
https://blog.csdn.net/c20081052/article/details/79715132

Linux 下設定環境變數有三種方法,一種用於當前終端,一種用於當前使用者,一種用於所有使用者:
一:用於當前終端:
在當前終端中輸入:export PATH=$PATH:<你的要加入的路徑>
不過上面的方法只適用於當前終端,一旦當前終端關閉或在另一個終端中,則無效。

  export NDK_ROOT=/home/jiang/soft/Android-ndk-r8e 

只能在當前終端使用
二:用於當前使用者:
在使用者主目錄下有一個 .bashrc 隱藏檔案,可以在此檔案中加入 PATH 的設定如下:

$ gedit ~/.bashrc

加入:

export PATH=<你的要加入的路徑>:$PATH

如果要加入多個路徑,只要:

export PATH=<你要加入的路徑1>:<你要加入的路徑2>: ...... :$PATH

當中每個路徑要以冒號分隔

這樣每次登入都會生效

新增PYTHONPATH的方法也是這樣,在.bashrc中新增

export PYTHONPATH=/home/zhao/setup/caffemaster/python:/home/zhao/setup/mypy:$PYTHONPATH 

儲存後在終端輸入 $ source ~/.bashrc 使環境變數立即生效

三:用於所有使用者

$ sudo gedit /etc/profile 

加入:

export PATH=<你要加入的路徑>:$PATH

就可以了。
終端輸入:echo $PATH 可以檢視環境變數

注意,修改環境變數後,除了第一種方法立即生效外,第二第三種方法要立即生效,可以source ~/.bashrc或者登出再次登入後就可以了!

到此引用結束

2.3.3 方法二 :

在程式碼中加入語句

import sys
sys.path
sys.path.append('/home/xilinx/.local/lib/python3.6/site-packages')

sys.path是檢視jupyter的庫查詢路徑,可以檢視你的jupyter是否包括了你的包的路徑
一般來說庫匯入失敗都是由於這個原因——jupyter庫路徑
這是設定引用額外引用路徑的方法:

sys.path.append('')

可參考這篇文章:
https://www.cnblogs.com/mandy-study/p/7735801.html

3. 提供程式碼

# 關鍵識別程式碼
barcodes = decode(image)
def decode (image,barcodes):
    
    # loop over the detected barcodes
    
    for barcode in barcodes:
        
        # extract the bounding box location of the barcode and draw the
        # bounding boxr surrounding the barcode on the image

        (x, y, w, h) = barcode.rect

        cv2.rectangle(image, (x, y),(x + w,y + h), (255, 0, 0), 5)

        # the barcode data is a bytes object so if we want to draw it on
        # our output image wre need to convert it to a string first
        barcodeData = barcode.data.decode("utf-8")

        barcodeType = barcode.type

        # draw the barcode data and barcode type on the image

        text ="{} ({})". format(barcodeData,barcodeType)

        cv2.putText(image,text,(x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,.8, (255, 0, 0), 2) 

        # print the barcode type and data to the terminal

        print("[INFO] Found {} barcode: {}".format(barcodeType,barcodeData))
        
    plt.figure(figsize=(10,10))
    
    plt.imshow(image)
    
    plt.show()
    
# Decoding barcodes

decode(image,barcodes)

最終結果,發現框框並不是很貼合,可能是照片照的問題。但是識別的結果完全正確

在這裡插入圖片描述

完整程式碼請見連線:
https://download.csdn.net/download/weixin_44360347/15816188

開啟是.ipynb格式。

  • 更多技術文章和學習資料,請關注我的公眾號:【積體電路設計教程】
  • 全平臺統一:【雪天魚】

相關文章