項(xiàng)目 基于深度學(xué)習(xí)二維碼檢測(cè)識(shí)別系統(tǒng))
文章目錄0 簡(jiǎn)介1 二維碼基礎(chǔ)概念1.1 二維碼介紹1.2 QRCode1.3 QRCode 特點(diǎn)2 機(jī)器視覺(jué)二維碼識(shí)別技術(shù)2.1 二維碼的識(shí)別流程2.2 二維碼定位2.3 常用的掃描方法4 深度學(xué)習(xí)二維碼識(shí)別4.1 部分關(guān)鍵代碼最后0 簡(jiǎn)介今天學(xué)長(zhǎng)向大家分享一個(gè)畢業(yè)設(shè)計(jì)項(xiàng)目**畢業(yè)設(shè)計(jì) 基于深度學(xué)習(xí)二維碼檢測(cè)識(shí)別系統(tǒng) **項(xiàng)目運(yùn)行效果畢業(yè)設(shè)計(jì) 深度學(xué)習(xí)二維碼檢測(cè)識(shí)別項(xiàng)目分享見(jiàn)主頁(yè)任意置頂文章1 二維碼基礎(chǔ)概念1.1 二維碼介紹二維條碼/二維碼2-dimensional barcode是用某種特定的幾何圖形按一定規(guī)律在平面二維方向上分布的、黑白相間的、記錄數(shù)據(jù)符號(hào)信息的圖形在代碼編制上巧妙地利用構(gòu)成計(jì)算機(jī)內(nèi)部邏輯基礎(chǔ)的“0”、“1”比特流的概念使用若干個(gè)與二進(jìn)制相對(duì)應(yīng)的幾何形體來(lái)表示文字?jǐn)?shù)值信息通過(guò)圖象輸入設(shè)備或光電掃描設(shè)備自動(dòng)識(shí)讀以實(shí)現(xiàn)信息自動(dòng)處理它具有條碼技術(shù)的一些共性每種碼制有其特定的字符集每個(gè)字符占有一定的寬度具有一定的校驗(yàn)功能等。同時(shí)還具有對(duì)不同行的信息自動(dòng)識(shí)別功能、及處理圖形旋轉(zhuǎn)變化點(diǎn)。1.2 QRCode常見(jiàn)的二維碼為QR CodeQR全稱Quick Response是一個(gè)近幾年來(lái)移動(dòng)設(shè)備上超流行的一種編碼方式它比傳統(tǒng)的BarCode條形碼能存更多的信息也能表示更多的數(shù)據(jù)類型。1.3 QRCode 特點(diǎn)1、符號(hào)規(guī)格從版本121×21模塊到版本40177×177 模塊每提高一個(gè)版本每邊增加4個(gè)模塊。2、數(shù)據(jù)類型與容量參照最大規(guī)格符號(hào)版本40-L級(jí)數(shù)字?jǐn)?shù)據(jù)7,089個(gè)字符字母數(shù)據(jù): 4,296個(gè)字符8位字節(jié)數(shù)據(jù): 2,953個(gè)字符漢字?jǐn)?shù)據(jù)1,817個(gè)字符3、數(shù)據(jù)表示方法深色模塊表示二進(jìn)制1淺色模塊表示二進(jìn)制0。4、糾錯(cuò)能力L級(jí)約可糾錯(cuò)7%的數(shù)據(jù)碼字M級(jí)約可糾錯(cuò)15%的數(shù)據(jù)碼字Q級(jí)約可糾錯(cuò)25%的數(shù)據(jù)碼字H級(jí)約可糾錯(cuò)30%的數(shù)據(jù)碼字5、結(jié)構(gòu)鏈接可選可用1-16個(gè)QR Code碼符號(hào)表示一組信息。每一符號(hào)表示100個(gè)字符的信息。2 機(jī)器視覺(jué)二維碼識(shí)別技術(shù)2.1 二維碼的識(shí)別流程首先 對(duì)采集的彩色圖像進(jìn)行灰度化 以提高后繼的運(yùn)行速度。其次 去除噪聲。 采用十字形中值濾波去除噪音對(duì)二碼圖像的干擾主要是鹽粒噪聲。利用灰度直方圖工具 使用迭代法選取適當(dāng)?shù)拈撝?對(duì)二維碼進(jìn)行二值化處理灰度化 去噪 二值化 尋找探測(cè)圖形確定旋轉(zhuǎn)角度 定位 旋轉(zhuǎn)獲得數(shù)據(jù)使其變?yōu)榘椎缀谏珬l碼。最后 確定二維碼的位置探測(cè)圖形 對(duì)條碼進(jìn)行定位 旋轉(zhuǎn)至水平后 獲得條碼數(shù)據(jù)以便下一步進(jìn)行解碼。2.2 二維碼定位QR 碼有三個(gè)形狀相同的位置探測(cè)圖形 在沒(méi)有旋轉(zhuǎn)的情況下 這三個(gè)位置探測(cè)圖形分別位于 QR 碼符號(hào)的左上角、 右上角和左下角。三個(gè)位置探測(cè)圖形共同組成圖像圖形。每個(gè)位置探測(cè)圖形可以看作是由 3 個(gè)重疊的同心的正方形組成 它們分別為 77 個(gè)深色模塊、 55 個(gè)淺模塊和 3*3 個(gè)深色模塊。位置探測(cè)圖形的模塊寬度比為 1: 1:3: 1: 1。這種 1: 1: 3: 1: 1 的寬度比例特征在圖像的其他位置出現(xiàn)的可能性很小 故可以將此作為位置探測(cè)圖形的掃描特征。 基于此特征當(dāng)一條直線上稱為掃描線 被黑白相間地截為1: 1: 3:1: 1 時(shí) 可以認(rèn)為該直線穿過(guò)了位置探測(cè)圖形。另外 該掃描特征不受圖像傾斜的影響。 對(duì)比中的兩個(gè) QR 碼符號(hào)可以發(fā)現(xiàn) 無(wú)論 QR碼符號(hào)是否傾斜 都符合 1: 1: 3:1: 1 的掃描特征。2.3 常用的掃描方法1. 在 X 方向進(jìn)行依次掃描。(1) 固定 Y 坐標(biāo)的取值 在 X 方向上畫一條水平直線稱為掃描線 進(jìn)行掃描。 當(dāng)掃描線被黑白相間地截為 1: 1: 3: 1: 1 時(shí)可以認(rèn)為該直線穿過(guò)了位置探測(cè)圖形。 在實(shí)際判定時(shí) 比例系數(shù)允許 0. 5 的誤差 即比例系數(shù)為1 的 允許范圍為 0. 5~1. 5 比例系數(shù)為 3的 允許范圍為 2. 5~3. 5。(2) 當(dāng)尋找到有直線穿過(guò)位置探測(cè)圖形時(shí) 記錄下位置探測(cè)圖形的外邊緣相遇的第一點(diǎn)和最后一點(diǎn) A 和 B。 由 A、 B兩點(diǎn)為端點(diǎn)的線段稱為掃描線段。將掃描線段保存下來(lái)。用相同的方法 完成圖像中所有水平方向的掃描。2. 在 Y 方向 使用相同的方法 進(jìn)行垂直掃描 同樣保存掃描得到的掃描線段。掃描線段分類掃描步驟獲得的掃描線段是沒(méi)有經(jīng)過(guò)分類的 也就是對(duì)于特定的一條掃描線段 無(wú)法獲知其具體對(duì)應(yīng)于三個(gè)位置探測(cè)圖形中的哪一個(gè)。 在計(jì)算位置探測(cè)圖形中距離鄰域法的思想是 給定一個(gè)距離閾值 dT, 當(dāng)兩條掃描線段的中點(diǎn)的距離小于 d T 時(shí) 認(rèn)為兩條掃描線段在同一個(gè)鄰域內(nèi) 將它們分為一類反之則歸為不同的類別。距離鄰域法的具體步驟如下1 給定一個(gè)距離閾值 dT d T要求滿足以下條件 位于同一個(gè)位置探測(cè)圖形之中的任意兩點(diǎn)之間的距離小于 dT 位于不同位置探測(cè)圖形中的任意兩點(diǎn)之間的距離大于 d T2 新建一個(gè)類別 將第 1 條掃描線段歸入其中。3 對(duì)于第 i 條掃描線段 l i 2≤i≤n 做以下操作a) 求出 l i 的中點(diǎn) C i 。b) 分別計(jì)算C i與在已存在的每一個(gè)類別中的第一條掃描線段的中點(diǎn)的距離d若 dd T 則直接將 l i 加入相應(yīng)類別中。c) 若無(wú)法找到 l i 可以加入的類別 則新建一個(gè)類別 將 l i 加入其中。4 將所有類別按照包含掃描線段的數(shù)目進(jìn)行從大到小排序 保存前 3 個(gè)類別即包含掃描線段數(shù)目最多的 3 個(gè)類別 其余的視為誤判得到的掃描線段在位置探測(cè)圖形以外的位置得到的符合掃描特征的掃描線段直接舍去。距離鄰域法結(jié)束后得到的分好 3 個(gè)類別的掃描線段就分別對(duì)應(yīng)了 3 個(gè)位置探測(cè)圖形。距離鄰域法的關(guān)鍵就是距離閾值的選取。 一般對(duì)于不同大小的 QR碼圖像 要使用不同的距離閾值。1 在 X 方向的掃描線段中找出最外側(cè)的兩條 分別取中點(diǎn) 記為 A、 B。 由 A、 B兩點(diǎn)連一條直線。2 在 Y 方向的掃描線段中找出最外側(cè)的兩條 分別取中點(diǎn) 記為 C、 D。 由 C、 D兩點(diǎn)連一條直線。3 計(jì)算直線 AB 與直線 CD 的交點(diǎn) O 即為位置探測(cè)圖形中心點(diǎn)。將 QR 碼符號(hào)的左上、 右上位置探測(cè)圖形的中心分別記為 A、 B。 連接 A、 B。 直線 AB 與水平線的夾角α 即為 QR 碼符號(hào)的旋轉(zhuǎn)角度。對(duì)于該旋轉(zhuǎn)角度α 求出其正弦值 sinα 與余弦值 cosα 即可。 具體計(jì)算公式如下位置探測(cè)圖形邊長(zhǎng)的計(jì)算是基于無(wú)旋轉(zhuǎn)圖像的 在無(wú)旋轉(zhuǎn)圖像中 水平掃描線段的長(zhǎng)度即為位置探測(cè)圖形的邊長(zhǎng)。水平掃描線段 AB 的長(zhǎng)度即為位置探測(cè)圖形的邊長(zhǎng) X。對(duì)于經(jīng)過(guò)旋轉(zhuǎn)的 QR 碼圖像 先通過(guò)插值算法生成旋正的 QR 碼圖像 然后按照如上所述的方法進(jìn)行位置探測(cè)圖形邊長(zhǎng)的計(jì)算4 深度學(xué)習(xí)二維碼識(shí)別基于 CNN 的二維碼檢測(cè)網(wǎng)絡(luò)結(jié)構(gòu)如下4.1 部分關(guān)鍵代碼篇幅有限學(xué)長(zhǎng)在這只給出部分關(guān)鍵代碼首先定義一個(gè) AlgoQrCode.h?#pragma once #include #include using namespace cv; using namespace std; class AlgoQRCode { private: Ptrwechat_qrcode::WeChatQRCode detector; public: bool initModel(string modelPath); string detectQRCode(string strPath); bool compression(string inputFileName, string outputFileName, int quality); void release(); };?該頭文件定義了一些方法包含了加載模型、識(shí)別二維碼、釋放資源等方法以及一個(gè) detector 對(duì)象用于識(shí)別二維碼。然后編寫對(duì)應(yīng)的源文件 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 makePtrwechat_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; } vectorMat vPoints; vectorcv::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) { vectorintcompression_params; compression_params.push_back(IMWRITE_JPEG_QUALITY); compression_params.push_back(quality); //圖像壓縮參數(shù)該參數(shù)取值范圍為0-100數(shù)值越高圖像質(zhì)量越高 bool bRet imwrite(outputFileName, srcImage, compression_params); return bRet; } return false; } void AlgoQRCode::release() { detector NULL; }?最后項(xiàng)目運(yùn)行效果畢業(yè)設(shè)計(jì) 深度學(xué)習(xí)二維碼檢測(cè)識(shí)別項(xiàng)目分享見(jiàn)主頁(yè)任意置頂文章