0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用OpenCV與微信二維碼引擎實(shí)現(xiàn)二維碼識(shí)別

新機(jī)器視覺 ? 來源:稀土掘金 ? 作者:Tony沈哲 ? 2022-04-06 10:01 ? 次閱讀

背景

今年自疫情以來,我都沒有寫過文章。一方面是疫情導(dǎo)致居家辦公比較煩躁,另一方面最近有點(diǎn)懶了。但是工作還是要繼續(xù),趁這幾天優(yōu)化了一下最近的項(xiàng)目,我整理了一下如何使用 OpenCV 和微信二維碼引擎來實(shí)現(xiàn)二維碼的識(shí)別。

微信開源了其二維碼的解碼功能,并貢獻(xiàn)給 OpenCV 社區(qū)。其開源的 wechat_qrcode 項(xiàng)目被收錄到 OpenCV contrib 項(xiàng)目中。從 OpenCV 4.5.2 版本開始,就可以直接使用。
該項(xiàng)目 github 地址:

https://github.com/opencv/opencv_contrib/tree/master/modules/wechat_qrcode

模型文件的地址:

https://github.com/WeChatCV/opencv_3rdparty

微信的掃碼引擎,很早就支持了遠(yuǎn)距離二維碼檢測(cè)、自動(dòng)調(diào)焦定位、多碼檢測(cè)識(shí)別等功能,它是基于 CNN 的二維碼檢測(cè)。

9ee56f9e-afe3-11ec-aa7f-dac502259ad0.jpg

基于CNN的二維碼檢測(cè)器

二維碼識(shí)別的封裝

首先,定義一個(gè) AlgoQrCode.h

#pragmaonce
#include
#include
usingnamespacecv;
usingnamespacestd;

classAlgoQRCode
{
private:
Ptrdetector;

public:
boolinitModel(stringmodelPath);

stringdetectQRCode(stringstrPath);

boolcompression(stringinputFileName,stringoutputFileName,intquality);

voidrelease();
};

該頭文件定義了一些方法,包含了加載模型、識(shí)別二維碼、釋放資源等方法,以及一個(gè) detector 對(duì)象用于識(shí)別二維碼。
然后編寫對(duì)應(yīng)的源文件 AlgoQrCode.cpp

boolAlgoQRCode::initModel(stringmodelPath){
stringdetect_prototxt=modelPath+"detect.prototxt";
stringdetect_caffe_model=modelPath+"detect.caffemodel";
stringsr_prototxt=modelPath+"sr.prototxt";
stringsr_caffe_model=modelPath+"sr.caffemodel";
try
{
detector=makePtr(detect_prototxt,detect_caffe_model,sr_prototxt,sr_caffe_model);
}
catch(conststd::exception&e)
{
cout<endl;
returnfalse;
}

returntrue;
}

stringAlgoQRCode::detectQRCode(stringstrPath)
{
if(detector==NULL){
return"-1";
}

vectorvPoints;
vectorvStrDecoded;
MatimgInput=imread(strPath,IMREAD_GRAYSCALE);
//vStrDecoded=detector->detectAndDecode(imgInput,vPoints);
....
}

boolAlgoQRCode::compression(stringinputFileName,stringoutputFileName,intquality){
MatsrcImage=imread(inputFileName);

if(srcImage.data!=NULL)
{
vector<int>compression_params;
compression_params.push_back(IMWRITE_JPEG_QUALITY);
compression_params.push_back(quality);//圖像壓縮參數(shù),該參數(shù)取值范圍為0-100,數(shù)值越高,圖像質(zhì)量越高

boolbRet=imwrite(outputFileName,srcImage,compression_params);

returnbRet;
}

returnfalse;
}

voidAlgoQRCode::release(){
detector=NULL;
}

其中:initModel() 方法用于加載算法模型文件,必須先調(diào)用,并且只需要調(diào)用一次即可。模型文件

9ef8a3de-afe3-11ec-aa7f-dac502259ad0.jpg

detectQRCode() 方法需要根據(jù)業(yè)務(wù)場(chǎng)景,先對(duì)圖像做很多預(yù)處理的工作,然后再進(jìn)行二維碼的識(shí)別。這些預(yù)處理的過程,不再本文的討論范圍之列,以后有機(jī)會(huì)單獨(dú)寫一篇文章。

compression() 方法用于壓縮圖像,因?yàn)槲覀兪褂?a target="_blank">工業(yè)相機(jī)拍攝,圖片會(huì)很大大概30M+,所以在使用之前會(huì)先壓縮一下。

release() 方法可以在程序結(jié)束時(shí),釋放 detector 對(duì)象。

識(shí)別二維碼,其實(shí)就是調(diào)用 detector 對(duì)象的 detectAndDecode() 方法。

最后,寫一個(gè) main() 函數(shù)測(cè)試一下,是否可用:

9f0bb4e2-afe3-11ec-aa7f-dac502259ad0.jpg

intmain()
{
AlgoQRCodealgoQrCode=AlgoQRCode();
algoQrCode.initModel("/Users/tony/IdeaProjects/creative-mirror-watcher/mirror/src/main/resources/");
stringvalue=algoQrCode.detectQRCode("/Users/tony/20220216851652_compress.jpeg");
cout<<"value="<endl;
}

執(zhí)行結(jié)果,識(shí)別二維碼的內(nèi)容:

value={
"osVersion":"iOS13.3",
"model":"蘋果iPhoneX",
"ip":"10.184.17.170",
"port":10123
}

寫到這里,基本上完成了二維碼識(shí)別的封裝,可以給上層平臺(tái)編譯對(duì)應(yīng)的算法包了。
我們最終是需要使用 Java/Kotlin 在 Windows 平臺(tái)上調(diào)用該 cv 程序。因?yàn)樵擁?xiàng)目是一款智能設(shè)備的上位機(jī)程序。所以還需要編寫一個(gè) jni 程序供 Java/Kotlin 調(diào)用,這個(gè)過程就不再闡述了。最后,將 cv 程序和 jni 相關(guān)的代碼最終編譯成一個(gè) dll 文件,供上位機(jī)程序調(diào)用,實(shí)現(xiàn)最終的需求。

總結(jié)

其實(shí),上述代碼可以供各種平臺(tái)使用,無論是移動(dòng)端、桌面端、服務(wù)端。微信開源了一款非??焖俚亩S碼引擎,節(jié)省了我們?cè)却罅康墓ぷ鳌?/p>

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 二維碼
    +關(guān)注

    關(guān)注

    7

    文章

    406

    瀏覽量

    26371
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3218

    瀏覽量

    42329
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    625

    瀏覽量

    41215

原文標(biāo)題:使用 OpenCV + 微信二維碼引擎實(shí)現(xiàn)二維碼識(shí)別

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    二維碼識(shí)讀設(shè)備有哪些類型

    隨著二維碼應(yīng)用的日益普及,各類二維碼識(shí)讀設(shè)備也應(yīng)運(yùn)而生。這些設(shè)備不僅極大地方便了我們的日常生活,也為企業(yè)提供了更加高效便捷的服務(wù)。那么,你知道二維碼識(shí)讀設(shè)備都有哪些類型嗎?讓我們一起來了解一下。據(jù)
    的頭像 發(fā)表于 11-05 16:10 ?63次閱讀
    <b class='flag-5'>二維碼</b>識(shí)讀設(shè)備有哪些類型

    二維碼掃描頭設(shè)備嵌入到閘機(jī)上,實(shí)現(xiàn)掃手機(jī)屏幕完成簽到簽退

    如何嵌入到閘機(jī)上,實(shí)現(xiàn)掃手機(jī)屏幕完成簽到簽退的過程及其優(yōu)勢(shì)。一、二維碼掃描頭設(shè)備的嵌入技術(shù)二維碼掃描頭設(shè)備作為一種高效的信息采集工具,其核心技術(shù)在于快速、準(zhǔn)確地讀取并
    的頭像 發(fā)表于 09-18 15:45 ?202次閱讀
    <b class='flag-5'>二維碼</b>掃描頭設(shè)備嵌入到閘機(jī)上,<b class='flag-5'>實(shí)現(xiàn)</b>掃手機(jī)屏幕<b class='flag-5'>碼</b>完成簽到簽退

    工業(yè)二維碼掃描設(shè)備如何助力流水線生產(chǎn)?

    工業(yè)二維碼掃描設(shè)備被廣泛應(yīng)用于現(xiàn)代工廠的流水線作業(yè)中,它們能夠高效、準(zhǔn)確地讀取移動(dòng)中的二維碼。這些掃器通常被設(shè)計(jì)為固定式或手持式,以適應(yīng)不同的生產(chǎn)環(huán)境和需求。固定式掃器安裝在特定位
    的頭像 發(fā)表于 08-12 14:56 ?209次閱讀
    工業(yè)<b class='flag-5'>二維碼</b>掃描設(shè)備如何助力流水線生產(chǎn)?

    如何為柜式終端設(shè)備選配(集成)二維碼模塊?

    的設(shè)計(jì)與升級(jí)過程中,集成高性能的二維碼模塊是提升用戶體驗(yàn)、優(yōu)化業(yè)務(wù)流程的關(guān)鍵一環(huán)。首要考慮的是功能需求匹配,根據(jù)具體應(yīng)用場(chǎng)景,甄選既能讀取傳統(tǒng)二維碼又能識(shí)別屏幕
    的頭像 發(fā)表于 08-05 15:48 ?214次閱讀
    如何為柜式終端設(shè)備選配(集成)<b class='flag-5'>二維碼</b>模塊?

    Labview生成二維碼

    ?Labview 的一個(gè)Demo,生成二維碼
    發(fā)表于 08-01 17:12 ?6次下載

    二維碼器/二維碼讀取設(shè)備嵌入園區(qū)閘機(jī)系統(tǒng)中的應(yīng)用

    二維碼閱讀設(shè)備集成至閘機(jī)系統(tǒng)中,主要功能是通過掃描用戶的二維碼通行證來實(shí)施園區(qū)出入口的自動(dòng)收費(fèi)。此技術(shù)憑借二維碼的便利性及掃描設(shè)備的高效性,極大地提高了收費(fèi)效率和精確度,減少了由于人為錯(cuò)誤
    的頭像 發(fā)表于 06-05 14:46 ?287次閱讀
    <b class='flag-5'>二維碼</b>掃<b class='flag-5'>碼</b>器/<b class='flag-5'>二維碼</b>讀取設(shè)備嵌入園區(qū)閘機(jī)系統(tǒng)中的應(yīng)用

    二維碼模塊嵌入到電梯設(shè)備里

    二維碼模塊在電梯設(shè)備中的應(yīng)用1.二維碼模塊的基本介紹二維碼模塊是一種基于自動(dòng)
    的頭像 發(fā)表于 05-08 10:40 ?309次閱讀
    <b class='flag-5'>二維碼</b>掃<b class='flag-5'>碼</b>模塊嵌入到電梯設(shè)備里

    怎么在Framewin里顯示二維碼?

    各位前輩好,剛剛開始使用STemWin。現(xiàn)在一個(gè)Framewin里顯示二維碼,在Framewin初始化里調(diào)用二維碼函數(shù)沒有反應(yīng)。請(qǐng)問需要怎么調(diào)用?
    發(fā)表于 04-16 08:27

    遠(yuǎn)距離二維碼掃描器如何選擇?看看以下三款遠(yuǎn)距離二維碼模塊

    隨著二維碼相關(guān)技術(shù)及硬件的普及與低成本化,二維條碼掃描設(shè)備的應(yīng)用被人們廣為熟知,應(yīng)用的行業(yè)也眾多。然而,在某些場(chǎng)景中,由于需要遠(yuǎn)距離掃描二維碼(條碼遠(yuǎn)距離識(shí)別),傳統(tǒng)的掃
    的頭像 發(fā)表于 03-21 15:41 ?640次閱讀
    遠(yuǎn)距離<b class='flag-5'>二維碼</b>掃描器如何選擇?看看以下三款遠(yuǎn)距離<b class='flag-5'>二維碼</b>掃<b class='flag-5'>碼</b>模塊

    閘機(jī)安裝二維碼識(shí)別器輕松解決訪客預(yù)約通行難題

    在景區(qū)、學(xué)校、企業(yè)辦公樓等入口處隨處可見的二維碼訪客人行通道閘機(jī),是一種依托于二維碼識(shí)別技術(shù)的通行方式,即在門禁或通道閘機(jī)上安裝專用的二維碼識(shí)別
    的頭像 發(fā)表于 03-11 13:53 ?423次閱讀
    閘機(jī)安裝<b class='flag-5'>二維碼</b><b class='flag-5'>識(shí)別</b>器輕松解決訪客預(yù)約通行難題

    哪款二維碼掃碼頭適合安裝嵌入到點(diǎn)餐機(jī)?嵌入式二維碼的掃描機(jī)器詳解

    隨著時(shí)代的發(fā)展,自動(dòng)點(diǎn)餐環(huán)境愈發(fā)智能化,其主要原因是以掃模塊、二維碼掃碼頭等嵌入式二維碼的掃描機(jī)器為核心部件的自助點(diǎn)餐機(jī)的出現(xiàn),給顧客帶來更好的操作體驗(yàn)。比如麥當(dāng)勞、肯德基的點(diǎn)餐機(jī),它提升了用戶
    的頭像 發(fā)表于 02-26 14:31 ?319次閱讀
    哪款<b class='flag-5'>二維碼</b>掃碼頭適合安裝嵌入到點(diǎn)餐機(jī)?嵌入式<b class='flag-5'>二維碼</b>的掃描機(jī)器詳解

    Labview調(diào)用Halcon識(shí)別二維碼

    Labview調(diào)用Halcon識(shí)別二維碼 可一次識(shí)別多個(gè)二維碼 使用Labview 2020編輯,halcon的版本是 19.11,32位
    發(fā)表于 02-21 16:31

    怎樣快速選擇二維碼掃描儀模組

    二維碼掃描儀模組的應(yīng)用需求場(chǎng)景很多,除了我們生活中比較常見的支付場(chǎng)景,如在智慧交通的車載二維碼收費(fèi)、自動(dòng)售賣及金融類POS等在內(nèi)的各種嵌入集成應(yīng)用中,內(nèi)置的硬解碼掃窗上都配置有這種類型的二維
    的頭像 發(fā)表于 01-11 14:30 ?387次閱讀
    怎樣快速選擇<b class='flag-5'>二維碼</b>掃描儀模組

    虹科分享 | AR世界揭秘:從二維碼的起源到數(shù)據(jù)識(shí)別與位姿技術(shù)的奇妙融合!

    引言:探索AR的神奇世界,我們將從二維碼的誕生談起。在這個(gè)科技的海洋中,二維碼是如何幫助AR實(shí)現(xiàn)數(shù)據(jù)獲取與位姿識(shí)別的呢?讓我們一起揭開這層神秘的面紗! 一、
    的頭像 發(fā)表于 11-26 18:40 ?533次閱讀
    虹科分享 | AR世界揭秘:從<b class='flag-5'>二維碼</b>的起源到數(shù)據(jù)<b class='flag-5'>識(shí)別</b>與位姿技術(shù)的奇妙融合!

    為什么很多自助設(shè)備要嵌入二維碼模塊?一二維以及長(zhǎng)距離掃描頭

    起到了積極的作用。因此,在自助設(shè)備領(lǐng)域,使用高性能、低成本的二維碼模塊及其解決方案,可以極大地提高企業(yè)運(yùn)營(yíng)效率,增強(qiáng)企業(yè)競(jìng)爭(zhēng)力。基于近距離掃識(shí)別應(yīng)用的
    的頭像 發(fā)表于 11-21 15:05 ?526次閱讀
    為什么很多自助設(shè)備要嵌入<b class='flag-5'>二維碼</b>掃<b class='flag-5'>碼</b>模塊?一<b class='flag-5'>維</b><b class='flag-5'>二維</b>以及長(zhǎng)距離掃描頭