背景
????疫情已經(jīng)持續(xù)很久撞蜂,打算做一個健康碼顏色識別和信息提取的應(yīng)用匹层。本文采用opencv
和PaddleOCR疼邀、Flask來完成
PaddleOCR
????PaddleOCR旨在打造一套豐富代承、領(lǐng)先琅翻、且實(shí)用的OCR工具庫焙蹭,助力開發(fā)者訓(xùn)練出更好的模型晒杈,并應(yīng)用落地。
OpenCV
????OpenCV是一個基于Apache2.0許可(開源)發(fā)行的跨平臺計算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫孔厉,可以運(yùn)行在Linux拯钻、Windows、Android和Mac OS操作系統(tǒng)上撰豺。 [1] 它輕量級而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成粪般,同時提供了Python、Ruby污桦、MATLAB等語言的接口亩歹,實(shí)現(xiàn)了圖像處理和計算機(jī)視覺方面的很多通用算法。
Flask
????Flask是一個輕量級的可定制框架凡橱,使用Python語言編寫小作,較其他同類型框架更為靈活、輕便稼钩、安全且容易上手顾稀。它可以很好地結(jié)合MVC模式進(jìn)行開發(fā),開發(fā)人員分工合作坝撑,小型團(tuán)隊在短時間內(nèi)就可以完成功能豐富的中小型網(wǎng)站或Web服務(wù)的實(shí)現(xiàn)静秆。另外,F(xiàn)lask還有很強(qiáng)的定制性巡李,用戶可以根據(jù)自己的需求來添加相應(yīng)的功能抚笔,在保持核心功能簡單的同時實(shí)現(xiàn)功能的豐富與擴(kuò)展,其強(qiáng)大的插件庫可以讓用戶實(shí)現(xiàn)個性化的網(wǎng)站定制击儡,開發(fā)出功能強(qiáng)大的網(wǎng)站塔沃。
微信二維碼識別
????結(jié)合傳統(tǒng)計算機(jī)視覺和深度學(xué)習(xí)技術(shù),微信掃碼引擎解決了一圖多碼、大圖小碼蛀柴、魯棒解碼等業(yè)務(wù)痛點(diǎn)和技術(shù)難點(diǎn)螃概。只需3行代碼,輕松擁有微信的掃碼能力鸽疾。
import cv2
detector = cv2.wechat_qrcode_WeChatQRCode("detect.prototxt", "detect.caffemodel", "sr.prototxt", "sr.caffemodel")
img = cv2.imread("img.jpg")
res, points = detector.detectAndDecode(img)
print(res, points)
????從上面的代碼中可獲取二維碼的范圍吊洼,接下來主要使用預(yù)定好的顏色范圍去生成等值線,判斷是否存在
# 檢測顏色
def detect_color(image, color):
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # HSV
inRange_hsv = cv2.inRange(hsv, color_dist[color]['Lower'], color_dist[color]['Upper'])
contours = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
if len(contours) > 0 and draw_color_area(image, contours) > 0:
return True
else:
return False
# 標(biāo)記顏色區(qū)域
def draw_color_area(image, contours):
allarea, index = 0, -1
for i in range(len(contours)):
area = cv2.contourArea(contours[i])
allarea = area + allarea
return allarea
文字識別
????文字識別中主要使用了paddleocr制肮,目前用的笨辦法全部識別出來以后再去用正則表達(dá)式去匹配出合適的文字冒窍,主要是關(guān)注核酸時間和是否陰性。為了能離線使用豺鼻,最好提前下載好模型文件综液。
初始化代碼:
ocr = PaddleOCR(rec_model_dir='./ocr/rec/ch/ch_PP-OCRv3_rec_infer',det_model_dir='./ocr/det/ch/ch_PP-OCRv3_det_infer', cls_model_dir='./ocr/cls/ch_ppocr_mobile_v2.0_cls_infer')
文字識別代碼:
def getText(img):
res = ocr.ocr(img, det=True, cls=False)
pattern = re.compile('[0-9]+')
qgtime = '暫無數(shù)據(jù)'
isYin = ''
for i in res:
#print(i)
match= pattern.findall(i[1][0])
if (i[1][0].find(u"小時")>-1 or i[1][0].find(u"天")>-1) and match:
qgtime=i[1][0]
if (i[1][0].find(u"陰")>-1 or i[1][0].find(u"陽")>-1) and i[1][0].find(u"性")>-1:
isYin=i[1][0]
return qgtime,isYin
上傳文件接口
????用戶要通過上傳圖片文件來完成識別操作,這時候就需要使用flask儒飒。
上傳接口需要簡單設(shè)置下跨域(方便調(diào)試)以及路由接口谬莹,同時要驗(yàn)證文件后綴名,以保證上傳指定的文件桩了。
# 判斷文件是否合法
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
@app.route('/detect', methods=['POST'], strict_slashes=False)
@cross_origin(supports_credentials=True)
def dataDectect():
#print(datetime.datetime.now())
starttime = datetime.datetime.now()
file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER']) # 拼接成合法文件夾地址
file_dir = app.config['UPLOAD_FOLDER'] # 拼接成合法文件夾地址
if not os.path.exists(file_dir):
os.makedirs(file_dir) # 文件夾不存在就創(chuàng)建
f = request.files['img'] # 從表單的file字段獲取文件附帽,myfile為該表單的name值
if f and allowed_file(f.filename): # 判斷是否是允許上傳的文件類型
fname = f.filename
ext = fname.rsplit('.', 1)[1] # 獲取文件后綴
unix_time = int(time.time())
new_filename = str(unix_time) + '.' + ext # 修改文件名
filePath = os.path.join(file_dir, new_filename)
#print(datetime.datetime.now())
f.save(filePath) # 保存文件到upload目錄
#print(datetime.datetime.now())
img = cv2.imread(filePath)
codeName = webchatQrDetect(img)
qrtime,isYin=getText(img)
endtime = datetime.datetime.now()
duringtime = endtime - starttime
os.remove(filePath)
#print(datetime.datetime.now())
#print('the work use ', duringtime. microseconds/1000000)
# print('the work end', datetime.datetime.now(), datetime.datetime.now())
return jsonify({ "運(yùn)行時間":str(round(duringtime. seconds,3))+'s',"msg": "上傳成功",u"核酸時間": qrtime,u'狀態(tài)':isYin, u"健康碼": codeName})
else:
return jsonify({"msg": "上傳失敗"})
項(xiàng)目效果
????通過postman可以調(diào)用接口進(jìn)行測試
參考資料:
https://baike.baidu.com/item/Flask/1241509
https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/README_ch.md
https://github.com/WeChatCV/opencv_3rdparty
https://zhuanlan.zhihu.com/p/417226916
https://blog.yuanpei.me/posts/1509692610/
https://zhuanlan.zhihu.com/p/401841723
https://github.com/PaddlePaddle/PaddleOCR
https://ai.baidu.com/support/news?action=detail&id=2912
https://blog.csdn.net/Mrli0530/article/details/122185635
https://zhuanlan.zhihu.com/p/430174498
https://blog.csdn.net/Kukeoo/article/details/116245337
https://blog.csdn.net/qq_36853469/article/details/106416128
https://blog.csdn.net/juzicode00/article/details/122205315
https://zhuanlan.zhihu.com/p/348349456