Opencv项目实战:03 扫描二维码条形码
1,效果展示
聲明:二維碼會讓圖片違規(guī),我處理了一下,大家看看效果
?
?我們掃描出來的結(jié)果會有數(shù)字,網(wǎng)址鏈接,英文等。
2,項目準備
(1)安裝pyzbar
使用pip下載,打開控制面板,輸入:
pip install pyzbar?(2)在此項目下建立兩個.py文件,以及一個.text文件
?打開DataFile.text,輸入以下內(nèi)容:
111111 111112 111113 111114 111115或則輸入其他內(nèi)容,包括英文和數(shù)字,注意不要用中文。?
?(3)準備需要的二維碼和條形碼
二維碼生成網(wǎng)站:
在線二維碼生成器 ~ 二維工坊 (2weima.com)https://www.2weima.com/按照你寫的DataFile.text里面的內(nèi)容來生成二維碼,可以準備幾個其他內(nèi)容的二維碼,因為我們是在項目拓展中才會使用,亦或者使用生活中的二維碼,比如,書籍,牛奶盒,微信收款碼等等。
條形碼生成網(wǎng)站:
免費在線條形碼生成器 (t-x-m.com)http://t-x-m.com/條形碼無所謂多少。建議大家將準備好的二維碼和條形碼打印到一張紙上,方便掃描,我昨天打印的不見了,所以效果展示我就用手機拍下來掃描的。
3,代碼展示與講解
import cv2 import numpy as np from pyzbar.pyzbar import decodecap = cv2.VideoCapture(0) cap.set(3, 640) cap.set(4, 480)while True:success, img = cap.read()for barcode in decode(img):myData = barcode.data.decode('utf-8')print(myData)pts = np.array([barcode.polygon], np.int32)pts = pts.reshape((-1, 1, 2))cv2.polylines(img, [pts], True, (255, 0, 255), 5)pts2 = barcode.rectcv2.putText(img, myData, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX,0.9, (255, 0, 255), 2)cv2.imshow('Result', img)k=cv2.waitKey(1) & 0xFFif k==27:break?本次項目沒什么難點,我們直接講解一下,此項目實現(xiàn)的思路。先看我的分析,再去跟著敲一遍代碼。
- 首先,在本項目中不管是讀取圖像,還是讀取攝像頭都能實現(xiàn),那么我們在這里是實現(xiàn)攝像頭的實時掃描。讀取網(wǎng)絡攝像頭(在效果展示中,我采用的外用攝像頭),在cap.set()函數(shù)里面,用‘3’代表的是寬,用‘4’代表的是高的設置,使其窗口大小合適。
- 其次是在while True中,success接受的是布爾值,檢測是否讀取成功,用img讀取每一幀的圖像。采取pyzbar包中的decode函數(shù),對img進行解碼,并將解碼后的內(nèi)容打印在控制臺中,大家也可以嘗試將解碼的內(nèi)容打印出來,看看有些什么東西。(包括barcode.rect和barcode.data)
- 除此之外,在Opencv中繪制包圍住二維碼的方法有很多,比如繪制矩形、繪制多邊形;如果是選擇矩形框框,識別時二維碼存在的傾斜角度會導致添加的框框不能跟著傾斜,而這不是我們想要的效果,因此我們需要選用繪制多邊形。具體如下:
第一行使用numpy庫中array函數(shù),得到一個四點數(shù)據(jù)矩陣。其中barcode.polygon作用是從輪廓中提取polygon點,作為頂點(請看下方圖一);np.int32則是對于數(shù)據(jù)的類型約束。
第二行的reshape((-1,1,2))函數(shù),-1表示行有先,主要功能是將原有的數(shù)據(jù)形狀轉(zhuǎn)換為opencv中常用的形狀:(x,1,y),便于使用(請看下方圖二)。如將(4,2)轉(zhuǎn)換為(4,1,2)。
第三行就是繪畫多邊形的過程,使用cv.ploylines函數(shù),繪制了一個閉合、紫色、寬度為五的四邊形。注意此次的布爾值指的是是否為閉合圖型。
?
圖一:
圖二:
?
- ?緊接著,是放置文本框,那么我們當然不需要它移動,我們希望的是它可以固定在某一點。那么在此處我們采取了rect的方法,得到如下圖所表示:
- ?最后,就是展示窗口,在此處如果想關閉窗口,點擊Esc鍵即可,27即是Esc鍵的Ascll碼。
4,項目拓展
項目拓展描述:
公司的員工使用工作牌掃描二維碼開門的想法的實現(xiàn),根據(jù)我們之前準備好的DataFile.text,以及生成的二維碼,如果掃描的是DataFile.text里的內(nèi)容就用綠色框和文本表示已經(jīng)授權(quán);否則,用紅色框和文本表示未授權(quán)。
我們來看看它的效果是怎么樣的。如下
?
?
項目實現(xiàn)的效果非常好,下面的代碼我也不再多做講解了,快去做起來吧!
import cv2 import numpy as np from pyzbar.pyzbar import decodecap = cv2.VideoCapture(1) cap.set(3, 640) cap.set(4, 480)with open('DataFile.text') as f:myDataList = f.read().splitlines()while True:success, img = cap.read()for barcode in decode(img):myData = barcode.data.decode('utf-8')print(myData)if myData in myDataList:myOutput = 'Authorized'myColor = (0, 255, 0)else:myOutput = 'Un-Authorized'myColor = (0, 0, 255)pts = np.array([barcode.polygon], np.int32)pts = pts.reshape((-1, 1, 2))cv2.polylines(img, [pts], True, myColor, 5)pts2 = barcode.rectcv2.putText(img, myOutput, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, myColor, 2)cv2.imshow('Result', img)k = cv2.waitKey(1) & 0xFFif k == 27:break5,項目總結(jié)與評價
本次項目中,由于我也不是很很了解reshape函數(shù),還是查了資料才了解,對于二維碼的掃描都是相當不錯的,但對于條形碼的掃描,在生活中的條形碼沒能成功,可能與攝像頭有關吧。
希望你在本項目中玩的開心!!!
?
6,項目素材
可惜,二維碼圖片可能會違規(guī),大家就自己在網(wǎng)站制作吧,需用自取
?barcode:
總結(jié)
以上是生活随笔為你收集整理的Opencv项目实战:03 扫描二维码条形码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。