計算機競賽 python+opencv+深度學習實現二維碼識別

0 前言

🔥 優質競賽項目系列,今天要分享的是

🚩 python+opencv+深度學習實現二維碼識別

🥇學長這里給一個題目綜合評分(每項滿分5分)

  • 難度系數:3分
  • 工作量:3分
  • 創新點:3分

該項目較為新穎,適合作為競賽課題方向,學長非常推薦!

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate

2 二維碼基礎概念

2.1 二維碼介紹

二維條碼/二維碼(2-dimensional bar
code)是用某種特定的幾何圖形按一定規律在平面(二維方向上)分布的、黑白相間的、記錄數據符號信息的圖形;在代碼編制上巧妙地利用構成計算機內部邏輯基礎的“0”、“1”比特流的概念,使用若干個與二進制相對應的幾何形體來表示文字數值信息,通過圖象輸入設備或光電掃描設備自動識讀以實現信息自動處理:它具有條碼技術的一些共性:每種碼制有其特定的字符集;每個字符占有一定的寬度;具有一定的校驗功能等。同時還具有對不同行的信息自動識別功能、及處理圖形旋轉變化點。

2.2 QRCode

常見的二維碼為QR Code,QR全稱Quick Response,是一個近幾年來移動設備上超流行的一種編碼方式,它比傳統的Bar
Code條形碼能存更多的信息,也能表示更多的數據類型。

2.3 QRCode 特點

1、符號規格從版本1(21×21模塊)到版本40(177×177 模塊),每提高一個版本,每邊增加4個模塊。

2、數據類型與容量(參照最大規格符號版本40-L級):

  • 數字數據:7,089個字符
  • 字母數據: 4,296個字符
  • 8位字節數據: 2,953個字符
  • 漢字數據:1,817個字符

3、數據表示方法:

  • 深色模塊表示二進制"1",淺色模塊表示二進制"0"。

4、糾錯能力:

  • L級:約可糾錯7%的數據碼字
  • M級:約可糾錯15%的數據碼字
  • Q級:約可糾錯25%的數據碼字
  • H級:約可糾錯30%的數據碼字

5、結構鏈接(可選)

  • 可用1-16個QR Code碼符號表示一組信息。每一符號表示100個字符的信息。

3 機器視覺二維碼識別技術

3.1 二維碼的識別流程

在這里插入圖片描述

首先, 對采集的彩色圖像進行灰度化, 以提高后繼的運行速度。

其次, 去除噪聲。 采用十字形中值濾波去除噪音對二碼圖像的干擾主要是鹽粒噪聲。

利用灰度直方圖工具, 使用迭代法選取適當的閾值, 對二維碼進行二值化處理,灰度化 去噪 二值化 尋找探測圖形確定旋轉角度 定位 旋轉
獲得數據使其變為白底黑色條碼。

最后, 確定二維碼的位置探測圖形, 對條碼進行定位, 旋轉至水平后, 獲得條碼數據,
以便下一步進行解碼。

3.2 二維碼定位

QR 碼有三個形狀相同的位置探測圖形, 在沒有旋轉的情況下, 這三個位置探測圖形分別位于 QR 碼符號的左上角、 右上角和左下角。
三個位置探測圖形共同組成圖像圖形。

在這里插入圖片描述

每個位置探測圖形可以看作是由 3 個重疊的同心的正方形組成, 它們分別為 7 7 個深色模塊、 5 5 個淺模塊和 3*3 個深色模塊。
位置探測圖形的模塊寬度比為 1: 1:3: 1: 1。

在這里插入圖片描述

這種 1: 1: 3: 1: 1 的寬度比例特征在圖像的其他位置出現的可能性很小, 故可以將此作為位置探測圖形的掃描特征。 基于此特征,
當一條直線上(稱為掃描線) 被黑白相間地截為1: 1: 3:1: 1 時, 可以認為該直線穿過了位置探測圖形。

另外, 該掃描特征不受圖像傾斜的影響。 對比中的兩個 QR 碼符號可以發現, 無論 QR碼符號是否傾斜, 都符合 1: 1: 3:1: 1 的掃描特征。

在這里插入圖片描述

3.3 常用的掃描方法

  1. 在 X 方向進行依次掃描。

(1) 固定 Y 坐標的取值, 在 X 方向上畫一條水平直線(稱為掃描線) 進行掃描。 當掃描線被黑白相間地截為 1: 1: 3: 1: 1 時,
可以認為該直線穿過了位置探測圖形。 在實際判定時, 比例系數允許 0. 5 的誤差, 即比例系數為1 的, 允許范圍為 0. 5~1. 5, 比例系數為 3
的, 允許范圍為 2. 5~3. 5。

(2) 當尋找到有直線穿過位置探測圖形時, 記錄下位置探測圖形的外邊緣相遇的第一點和最后一點 A 和 B。 由 A、 B
兩點為端點的線段稱為掃描線段。將掃描線段保存下來。

在這里插入圖片描述

用相同的方法, 完成圖像中所有水平方向的掃描。

  1. 在 Y 方向, 使用相同的方法, 進行垂直掃描, 同樣保存掃描得到的掃描線段。

掃描線段分類掃描步驟獲得的掃描線段是沒有經過分類的, 也就是對于特定的一條掃描線段, 無法獲知其具體對應于三個位置探測圖形中的哪一個。
在計算位置探測圖形中心坐標之前, 要將所有的掃描線段按照位置進行歸類。 一般采用距離鄰域法進行掃描線段的分類。

距離鄰域法的思想是: 給定一個距離閾值 dT, 當兩條掃描線段的中點的距離小于 d T 時, 認為兩條掃描線段在同一個鄰域內, 將它們分為一類,
反之則歸為不同的類別。

距離鄰域法的具體步驟如下:
(1) 給定一個距離閾值 dT , d T要求滿足以下條件: 位于同一個位置探測圖形之中的任意兩點之間的距離小于 dT ,
位于不同位置探測圖形中的任意兩點之間的距離大于 d T
(2) 新建一個類別, 將第 1 條掃描線段歸入其中。
(3) 對于第 i 條掃描線段 l i (2≤i≤n), 做以下操作:

a) 求出 l i 的中點 C i 。

b) 分別計算C i與在已存在的每一個類別中的第一條掃描線段的中點的距離d,若 d<d T , 則直接將 l i 加入相應類別中。

c) 若無法找到 l i 可以加入的類別, 則新建一個類別, 將 l i 加入其中。

(4) 將所有類別按照包含掃描線段的數目進行從大到小排序, 保存前 3 個類別(即
包含掃描線段數目最多的 3 個類別), 其余的視為誤判得到的掃描線段(在位置探測圖形以外的位置得到的符合掃描特征的掃描線段),
直接舍去。距離鄰域法結束后得到的分好 3 個類別的掃描線段就分別對應了 3 個位置探測圖形。距離鄰域法的關鍵就是距離閾值的選取。 一般對于不同大小的 QR
碼圖像, 要使用不同的距離閾值。

(1) 在 X 方向的掃描線段中找出最外側的兩條, 分別取中點, 記為 A、 B。 由 A、 B兩點連一條直線。
在這里插入圖片描述

(2) 在 Y 方向的掃描線段中找出最外側的兩條, 分別取中點, 記為 C、 D。 由 C、 D兩點連一條直線。
在這里插入圖片描述

(3) 計算直線 AB 與直線 CD 的交點 O, 即為位置探測圖形中心點。

在這里插入圖片描述

將 QR 碼符號的左上、 右上位置探測圖形的中心分別記為 A、 B。 連接 A、 B。 直線 AB 與水平線的夾角α 即為 QR 碼符號的旋轉角度。

在這里插入圖片描述
對于該旋轉角度α , 求出其正弦值 sinα 與余弦值 cosα 即可。 具體計算公式如下:
在這里插入圖片描述

在這里插入圖片描述

位置探測圖形邊長的計算是基于無旋轉圖像的, 在無旋轉圖像中, 水平掃描線段的長度即為位置探測圖形的邊長。

水平掃描線段 AB 的長度即為位置探測圖形的邊長 X。

在這里插入圖片描述

對于經過旋轉的 QR 碼圖像, 先通過插值算法生成旋正的 QR 碼圖像, 然后按照如上所述的方法進

4 深度學習二維碼識別

基于 CNN 的二維碼檢測,網絡結構如下

在這里插入圖片描述

4.1 部分關鍵代碼

篇幅有限,學長在這只給出部分關鍵代碼

首先,定義一個 AlgoQrCode.h

?

    #pragma once
?    #include 
?    #include 
?    using namespace cv;
?    using namespace std;
?    class AlgoQRCode{private:Ptr<wechat_qrcode::WeChatQRCode> detector;public:bool initModel(string modelPath);string detectQRCode(string strPath);bool compression(string inputFileName, string outputFileName, int quality);void release();};?    

該頭文件定義了一些方法,包含了加載模型、識別二維碼、釋放資源等方法,以及一個 detector 對象用于識別二維碼。

然后編寫對應的源文件 AlgoQrCode.cpp

    
?    bool AlgoQRCode::initModel(string modelPath) {
?    	string detect_prototxt = modelPath + "detect.prototxt";
?    	string detect_caffe_model = modelPath + "detect.caffemodel";
?    	string sr_prototxt = modelPath + "sr.prototxt";
?    	string sr_caffe_model = modelPath + "sr.caffemodel";
?    	try
?    	{
?    		detector = makePtr<wechat_qrcode::WeChatQRCode>(detect_prototxt, detect_caffe_model, sr_prototxt, sr_caffe_model);
?    	}
?    	catch (const std::exception& e)
?    	{
?    		cout << e.what() << endl;
?    		return false;
?    	}
?    return true;}string AlgoQRCode::detectQRCode(string strPath){if (detector == NULL) {return "-1";}vector<Mat> vPoints;vector<cv::String> vStrDecoded;Mat imgInput = imread(strPath, IMREAD_GRAYSCALE);//	vStrDecoded = detector->detectAndDecode(imgInput, vPoints);....}bool AlgoQRCode::compression(string inputFileName, string outputFileName, int quality) {Mat srcImage = imread(inputFileName);if (srcImage.data != NULL){vector<int>compression_params;compression_params.push_back(IMWRITE_JPEG_QUALITY);compression_params.push_back(quality);     //圖像壓縮參數,該參數取值范圍為0-100,數值越高,圖像質量越高bool bRet = imwrite(outputFileName, srcImage, compression_params);return bRet;}return false;}void AlgoQRCode::release() {detector = NULL;}?    

5 測試結果

學長這里放到樹莓派中,調用外部攝像頭進行識別,可以看到,效果還是非常不錯的

在這里插入圖片描述

6 最后

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38687.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HotSpot虛擬機之字節碼執行引擎

目錄 一、棧幀 1. 棧幀結構 2. 基于棧的解釋執行過程 二、方法調用 1. 方法調用指令 2. 分派 三、動態類型語言 四、參考資料 一、棧幀 1. 棧幀結構 棧幀是Java虛擬機棧進行方法調用和執行的數據結構&#xff0c;是方法最基本的執行單元&#xff0c;是棧的元素。一個棧…

【環境配置】Windows10終端和VSCode下能夠直接打開Anaconda-Prompt

很多小伙伴在 Windows 下做深度學習開發的時候&#xff0c;遇到終端沒有在 Linux 那么方便&#xff0c;那么我們現在就可以來設置一下&#xff1b;這樣我們也可以在文件夾內部右鍵打開終端&#xff0c;也可以在 VS Code 里面新建一個虛擬環境的控制臺&#xff1b;這里主要是針對…

佛祖保佑,永不宕機,永無bug

當我們的程序編譯通過&#xff0c;能預防的bug也都預防了&#xff0c;其它的就只能交給天意了。當然請求佛祖的保佑也是必不可少的。 下面是一些常用的保佑圖&#xff1a; 佛祖保佑圖 ——————————————————————————————————————————…

【c語言】動態內存管理(超詳細)

他治愈了身邊所有人&#xff0c;唯獨沒有治愈他自己—超脫 csdn上的朋友你們好呀&#xff01;&#xff01;今天給大家分享的是動態內存管理 &#x1f440;為什么存在動態內存分配 我們定義的局部變量在棧區創建 int n 4;//在棧上開辟4個字節大小int arr[10] { 0 };//在棧上開…

Android Socket使用TCP協議實現手機投屏

本節主要通過實戰來了解Socket在TCP/IP協議中充當的是一個什么角色&#xff0c;有什么作用。通過Socket使用TCP協議實現局域網內手機A充當服務端&#xff0c;手機B充當客戶端&#xff0c;手機B連接手機A&#xff0c;手機A獲取屏幕數據轉化為Bitmap&#xff0c;通過Socket傳遞個…

Excel設置某列或者某行不某行不可以編輯,只讀屬性

設置單元格只讀的三種方式: 1、通過單元格只讀按鈕&#xff0c;設置為只為 設置行或者列的只讀屬性&#xff0c;可以設置整行或者整列只讀 2、設置單元格編輯控件為標簽控件(標簽控件不可編輯) 3、通過鎖定行&#xff0c;鎖定行的修改。鎖定的行與只讀行的區別在于鎖定的行不…

電子商務環境下旅游價值鏈

邁克爾 ? 波特(Michael E. Porter)在其《競爭優勢》一書中提出了“價值鏈” 的概念&#xff0c;并認為一家企業最核心的競爭優勢在于對價值鏈的設計。雖然邁克爾 ? 波 特提出的價值鏈主要是針對企業內部的價值鏈&#xff0c;但他視價值鏈為一系列連續完成的 活動&#xff…

openGauss學習筆記-40 openGauss 高級數據管理-鎖

文章目錄 openGauss學習筆記-40 openGauss 高級數據管理-鎖40.1 語法格式40.2 參數說明40.3 示例 openGauss學習筆記-40 openGauss 高級數據管理-鎖 如果需要保持數據庫數據的一致性&#xff0c;可以使用LOCK TABLE來阻止其他用戶修改表。 例如&#xff0c;一個應用需要保證表…

GPT垂直領域相關模型 現有的開源領域大模型

對于ToC端來說&#xff0c;廣大群眾的口味已經被ChatGPT給養叼了&#xff0c;市場基本上被ChatGPT吃的干干凈凈。雖然國內大廠在緊追不舍&#xff0c;但目前絕大多數都還在實行內測機制&#xff0c;大概率是不會廣泛開放的&#xff08;畢竟&#xff0c;各大廠還是主盯ToB、ToG市…

C/C++ 注意點補充

C/C 注意點補充 函數缺省 函數缺省 https://blog.csdn.net/xinger_28/article/details/83898804 // 是的&#xff0c;C語言中的函數不支持直接定義缺省參數。在你提供的代碼中&#xff0c;函數DelayXms沒有定義缺省參數。缺省參數只在一些高級編程語言中&#xff08;如C&…

flutter

1.dart語言學習 dart在線編輯器 //第一段dart代碼 void main() {ceshi c new ceshi(1,2);print(c.right);c.right 2;print(c.right);print(c.bottom);c.bottom 4;print(c.bottom); }class ceshi {num left, top;ceshi(this.left, this.top);num get right > left top;…

視頻集中存儲安防監控平臺EasyCVR優化AI硬件接入時的通道顯示異常問題

安防視頻監控平臺視頻集中存儲EasyCVR可拓展性強、視頻能力靈活、部署輕快&#xff0c;可支持的主流標準協議有國標GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持廠家私有協議與SDK接入&#xff0c;包括海康Ehome、海大宇等設備的SDK等。 安防監控視頻云存儲平臺EasyCVR既具…

【Python國內源】pip換源終極方法【Windows】

1、為什么要pip換源下載 安裝第三方庫時&#xff0c;很多庫來自于國外&#xff0c;下載速度慢得感人&#xff01; 2、常見的國內源 https://pypi.tuna.tsinghua.edu.cn/simple #清華 http://mirrors.aliyun.com/pypi/simple/ #阿里云 https://pypi.mirrors.ustc.e…

go_細節注意

go細節 一、使用指針接受者和不使用指針接受者1&#xff0c;不使用指針接受者&#xff1a;2&#xff0c;使用指針接受者3&#xff0c;區別與優劣勢 一、使用指針接受者和不使用指針接受者 1&#xff0c;不使用指針接受者&#xff1a; func (d dog) move() {fmt.Println("…

使用Logstash將數據從MySQL同步至Elasticsearch(有坑)

文章目錄 一、準備工作1、安裝elasticSearchkibana2、安裝MySQL3、安裝Logstash 二、全量同步1、準備MySQL數據與表2、上傳mysql-connector-java.jar3、啟動Logstash4、修改logstash.conf文件5、修改full_jdbc.sql文件6、打開Kibana創建索引和映射7、重啟logstash進行全量同步8…

TCP/IP協議追層分析物理層(第三十九課)

TCP/IP協議追層分析物理層(第三十九課) 1 物理層:建立、維護、斷開物理連接,定義了接口及介質,實現了比特流的傳輸。 1、傳輸介質分類 有線介質:網線(雙絞線)、光纖 無線介質:無線電 微波 激光 紅外線 2、雙絞線分類: 五類cat5: 適用于100Mbps 超五類cat5e:適用于…

Qt掃盲- Graphics View框架理論綜述

Graphics View框架理論綜述 一、概述二、Graphics View 體系結構1. The Scene2. The View3. 圖元 Item 三、圖形視圖坐標系統1. 圖元Item的坐標2. Scene Scene坐標3. View 視圖坐標4. 坐標映射 四、關鍵特性1. 縮放和旋轉2. 打印3. 拖放4. 鼠標指針和 提示5. 動畫6. OpenGL渲染…

【100天精通python】Day35:一文掌握GUI界面編程基本操作

目錄 專欄導讀 1 GUI 編程概述 1.1 為什么需要GUI&#xff1f; 1.2 常見的GUI編程工具和庫 1.3 GUI應用程序的組成和架構 2 使用Tkinter 庫 進行GUI編程 2.1 使用Tkinter庫進行GUI編程的基本流程 2.2 使用Tkinter庫進行GUI編程 2.2.1 導入Tkinter庫 2.2.2 添加標簽和…

繪制世界地圖or中國地圖

寫在前面 在8月初,自己需要使用中國地圖的圖形,自己就此也查詢相關的教程,自己也做一下小小總結,希望對自己和同學們有所幫助。 最終圖形 這個系列從2022年開始,一直更新使用R語言分析數據及繪制精美圖形。小杜的生信筆記主要分享小杜學習日常!如果,你對此感興趣可以加…

Flutter Engine編譯環境安裝

前言 根據設置引擎開發環境的描述&#xff0c;確保有以下可用依賴項&#xff1a; Linux、macOS 或 Windows。 Linux 支持 Android 和 Fuchsia 的交叉編譯工件&#xff0c;但不支持 iOS。macOS 支持 Android 和 iOS 的交叉編譯工件。Windows 不支持任何 Android、Fuchsia 或 i…