基於Python的二維碼實驗
一、機器視覺之QRcode
二、基於Python的QRcodetest
(一)配置環境
(二)生成自己的二維碼
(三)識別二維碼
三、調用opencv庫攝像頭識別圖像
(一)用opencv找出(條形碼&二維碼)位置
(二)調用解碼函數進行解碼
一、機器視覺之QRcode
問:什么是QRcode呢?
答:二維碼(2-dimensional bar code),是用某種特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄數據符號信息的。它能將數字、英文字母、漢字、日文字母、特殊符號(如空格,%,/ 等)、二進制等信息記錄到一個正方形的圖片中。
因此,在轉換的過程中,離不開編碼壓縮方式。在許多種類的二維條碼中,常用的碼制有:Data Matrix,Maxi Code,Aztec,QR Code,Vericode,PDF417,Ultracode,Code 49,Code 16K等。
二維碼在現實生活中的應用越來與普遍,歸功於 QR code 碼制的流行。我們常說的二維碼就是它,所以,二維碼又被稱為 QR code。
QR code 是一種矩陣式二維條碼(又稱棋盤式二維條碼)。它是在一個矩形空間通過黑、白像素在矩陣中的不同分布進行編碼。在矩陣相應元素位置上,用點(方點、圓點或其他形狀)的出現表示二進制“1”,點的不出現表示二進制的“0”,點的排列組合確定了矩陣式二維條碼所代表的意義。
我們的目的是要使用 Python 生成 QR 碼,那我們需要先了解二維碼(QR 碼)的結構。根據標准(ISO/IEC 18004),我們可以了解到 QR 碼結構如下:
二維碼的繪制大概過程如下:
在二維碼的左上角、左下角、右上角繪制位置探測圖形,位置探測圖形一定是一個 7x7 的矩陣;
(1)繪制校正圖形,校正圖形一定是一個 5x5 的矩陣;
(2)繪制兩條連接三個位置探測圖形的定位圖形;
(3)在上述圖片的基礎上,繼續繪制格式信息;
(4)接着繪制版本信息;
(5)填充數據碼和糾錯碼到二維碼圖中;
(6)最后繪制蒙版圖案。因為按照上述方式填充內容,可能會出現大面積空白或黑塊的情況,導致掃描識別十分困難。所以需要對整個圖像與蒙版進行蒙版操作(Masking),蒙版操作即為異或 XOR 操作。在這一步,我們可以將數據排列成各種圖片。
問:主要運用qrcode庫文件、這是個什么東東呢?
答: 這里給一篇博客有詳細敘述:Python生成二維碼
開源庫import qrcode具體使用方法:
編碼:
#原始二維碼編碼
import qrcode
img = qrcode.make('helloworld')
#帶圖片的編碼方式
qr = qrcode.QRCode(
version=5,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=8,
border=4)
1
2
3
4
5
6
7
8
9
解碼:
#調用decode()的解碼函數
def decode_qr_code(code_img_path):
if not os.path.exists(code_img_path):
raise FileExistsError(code_img_path)
# Here, set only recognize QR Code and ignore other type of code
return pyzbar.decode(Image.open(code_img_path), symbols=[pyzbar.ZBarSymbol.QRCODE])
1
2
3
4
5
6
二、基於Python的QRcodetest
環境:python3.7+zbar+qrcode
(一)配置環境
打開cmd、pip分別安裝以下庫文件:(zxing也是一個強大的二維碼開源庫文件,建議安裝)
pip install opencv-python
pip install numpy
pip install pillow
pip install myqr
pip install qrcode
pip install zxing
1
2
3
4
5
6
tips:記得安裝完成后,如果是eclipse要重新啟動一次才能加載進來
(二)生成自己的二維碼
1 MyQr制作gif二維碼:
同目錄下放置一張gif格式圖片
源碼:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from MyQR import myqr
myqr.run(
# 在命令后輸入鏈接或者句子作為參數,然后在程序的當前目錄中產生相應的二維碼圖片文件,默認命名為“qrcode.png”
words='helloworld',
version=1, # 設置容錯率為最高默認邊長是取決於你輸入的信息的長度和使用的糾錯等級;而默認糾錯等級是最高級的H
level='H', # 控制糾錯水平,范圍是L、M、Q、H,從左到右依次升高
picture='test.gif', # 用來將QR碼圖像與一張同目錄下的圖片相結合,產生一張黑白圖片,格式可以是.jpg, .png, .bmp, .gif
colorized=True, # 可以使產生的圖片由黑白(False)變為彩色(True)的
contrast=1.0, # 用以調節圖片的對比度,1.0 表示原始圖片,更小的值表示更低對比度,更大反之。默認為1.0。
brightness=1.0, # 用來調節圖片的亮度
)
1
2
3
4
5
6
7
8
9
10
11
12
13
2 qrcode制作帶圖片的二維碼:
新建工程QRcodeTest;新建PyDev包,命名為MakeMyQRcode:
因為我想做出一個漂亮簡單一點的code,所以首先在目錄文件下貼入一張圖片,命名為QRcodeCenter,like this(左:成果圖,右:准備中心圖片):
————————————————
版權聲明:本文為CSDN博主「cungudafa」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/cungudafa/article/details/85871871
===========================
''' ============================== test1:生成二維碼及查看 ============================== ''' from PIL import Image import qrcode qr = qrcode.QRCode( version=5, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=8, border=4) qr.add_data("這里是二維碼信息!") qr.make(fit=True) img = qr.make_image() img = img.convert("RGBA") icon = Image.open("f:/a.jpg") # 這里是二維碼中心的圖片 img_w, img_h = img.size factor = 4 size_w = int(img_w / factor) size_h = int(img_h / factor) print(str(size_w)+":"+str(img_w)) icon_w, icon_h = icon.size if icon_w > size_w: icon_w = size_w if icon_h > size_h: icon_h = size_h print("icon_h:"+str(icon_h)) icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS) w = int((img_w - icon_w) / 2) h = int((img_h - icon_h) / 2) print("w:"+str(w)) print("h:"+str(h)) icon = icon.convert("RGBA") img.paste(icon, (w, h), icon) img.show() # 顯示圖片,可以通過save保存 img.save("f:/1.png")
# -*- coding:utf-8 -*- ''' ==================================== test2:生成二維碼保存及對二維碼解碼輸出 ==================================== ''' import os import qrcode from PIL import Image from pyzbar import pyzbar import arcpy def make_qr_code(content, save_path=None): qr_code_maker = qrcode.QRCode(version=5, error_correction=qrcode.constants.ERROR_CORRECT_M, box_size=8, border=4, ) qr_code_maker.add_data(data=content) qr_code_maker.make(fit=True) img = qr_code_maker.make_image(fill_color="black", back_color="white") if save_path: img.save(save_path) else: img.show() # 中間圖不顯示 def make_qr_code_with_icon(content, icon_path, save_path=None): if not os.path.exists(icon_path): raise FileExistsError(icon_path) # First, generate an usual QR Code image qr_code_maker = qrcode.QRCode(version=5, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=8, border=4, ) qr_code_maker.add_data(data=content) qr_code_maker.make(fit=True) qr_code_img = qr_code_maker.make_image( fill_color="black", back_color="white").convert('RGBA') # Second, load icon image and resize it icon_img = Image.open(icon_path) code_width, code_height = qr_code_img.size icon_img = icon_img.resize( (code_width // 4, code_height // 4), Image.ANTIALIAS) # Last, add the icon to original QR Code qr_code_img.paste(icon_img, (code_width * 3 // 8, code_width * 3 // 8)) if save_path: qr_code_img.save(save_path) # 保存二維碼圖片 qr_code_img.show() # 顯示二維碼圖片 else: print("save error!") def decode_qr_code(code_img_path): if not os.path.exists(code_img_path): raise FileExistsError(code_img_path) # Here, set only recognize QR Code and ignore other type of code return pyzbar.decode(Image.open(code_img_path), symbols=[pyzbar.ZBarSymbol.QRCODE]) if __name__ == "__main__": inTable = arcpy.GetParameterAsText(0) nrField = arcpy.GetParameterAsText(1) print("============QRcodetest===============") print(" 1、Make a QRcode ") print(" 2、Scan a QRcode ") print("=====================================") print("1、請輸入編碼信息:") code_Data = input('>>:').strip() print("正在編碼:") # ==生成帶中心圖片的二維碼 make_qr_code_with_icon( code_Data, "f:/a.jpg", "f:/qrcode.png") # 內容,center圖片,生成二維碼圖片 print("圖片已保存,名稱為:qrcode.png") results = decode_qr_code("f:/qrcode.png") print("2、正在解碼:") if len(results): print("解碼結果是:") print(results[0].data.decode("utf-8")) else: print("Can not recognize.")