我是 雪天魚,一名FPGA愛好者,研究方向是FPGA架構探索和SOC設計。
關注公眾號,拉你進“IC設計交流群
”。
1.前言
單單實現一個二維碼識別就花了將近一個星期,這篇文章我就詳細介紹這段時間走過的坑,程式碼附在文末,著急需要的小夥伴直接翻到最後即可
2. linux配置
要想實現本專案,首先解決以下三大要點
,也著實浪費了很多時間
2.1解決pynq聯網
pynq聯網的教程網上可謂是不少,但是我卻整了很久。
首先是在家裡,我採用
所示的方法,然後成功ping通外網
在學校時這個方法卻解決不了,我嘗試了網上很多方法都無法解決(可能我太菜了),最終在重新燒錄了幾次映象後發現:直接把網線連到宿舍的路由器上就連上外網了...
具體還有關於修改下載源變為映象源的方法可以參考其他部落格
2.2解決pyzbar庫下載
這個庫下載推薦採用
pip3 install pyzbar
這個庫安裝的路徑也要注意,命令列下輸入
pip3 show pyzbar
我的在這裡:
多說一句,下面的zbar
包我採用
sudo apt-get install python-zbar
得到,為什麼不用pip3,因為pip3下載這個總是報錯,即使是
pip3 upgrade
也不行,不是pip3版本的問題。
我的linux映象是v2.3
版本的,不知道大家採用v2.5
或者更高會不會好些
2.3解決jupyter匯入庫
2.3.1 首先說明問題的由來
我發現使用
pip3 install pillow
PIL在jupyter下能匯入,但是卻不能匯入pyzbar
又發現在命令列輸入 python3
後,可以匯入pyzbar,但不能匯入zbar
我在命令列輸入pyhton
直譯器下發現不能匯入pyzbar
,但可以匯入zbar
這就引起了我的注意,最終我發現原來pip3
來的pyzbar
有單獨的儲存路徑,apt-get
同理
至於為什麼python和python3不能引入相同的包
那就得
import sys
sys.path
採用語句來觀察,發現引用路徑不一致。我想我知道了癥結所在:
$\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格式。
- 更多技術文章和學習資料,請關注我的公眾號:【積體電路設計教程】
- 全平臺統一:【雪天魚】